如何结合跨关系字段查询与聚合过滤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
相关产品推荐
相关产品推荐

