You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合跨关系字段查询与聚合过滤Django租赁房产模型?

问题描述

我有一组代表租赁房产的4个Django模型:

Property模型存储房产名称及其创建者:

class Property(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    creator = models.ForeignKey(User, related_name='creator', on_delete=models.PROTECT)
    name = models.CharField(max_length=100)

Property可通过ForeignKey关联多个Area实例;Area通过ForeignKey关联AreaType,还通过ManyToManyField关联多个Amenity:

class Area(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    type = models.ForeignKey(AreaType, on_delete=models.PROTECT)
    property = models.ForeignKey(Property, on_delete=models.PROTECT)
    amenities = models.ManyToManyField(Amenity, null=True, blank=True)

class AreaType(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=100)

class Amenity(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=100)

我熟悉普通及跨关系的字段查询,也会用kwargs过滤,但不清楚如何结合字段查询与聚合函数。现需实现:

  • 获取拥有至少3个名称为'Television'的Amenity的所有Property;
  • 获取拥有至少2个AreaType名称为'Bathroom'的Area的所有Property。
解决方案

1. 查询拥有至少3个'Television'设施的房产

通过跨关系筛选出关联'Television'设施的房产,用Count聚合统计对应设施数量,最后过滤出数量达标的房产:

from django.db.models import Count

properties_with_enough_tvs = Property.objects.filter(
    area__amenities__name='Television'
).annotate(
    tv_count=Count('area__amenities', distinct=True)
).filter(
    tv_count__gte=3
)
  • filter(area__amenities__name='Television')先缩小范围到关联目标设施的房产;
  • distinct=True避免同一设施因关联多个Area被重复计数;
  • 最后通过tv_count__gte=3筛选出满足数量要求的结果。

2. 查询拥有至少2个'Bathroom'区域的房产

通过Area关联到AreaType筛选目标区域,统计每个房产对应的该类型区域数量,再过滤达标结果:

from django.db.models import Count

properties_with_enough_bathrooms = Property.objects.filter(
    area__type__name='Bathroom'
).annotate(
    bathroom_count=Count('area', distinct=True)
).filter(
    bathroom_count__gte=2
)
  • filter(area__type__name='Bathroom')先筛选出关联目标区域类型的房产;
  • distinct=True确保每个Area只被计数一次;
  • 最后通过bathroom_count__gte=2得到符合要求的房产集合。

内容的提问来源于stack exchange,提问作者0xdesdenova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:06:28