Django 返回相关模型精确引用两次的所有对象
我有以下型号:Django 返回相关模型精确引用两次的所有对象,django,django-queryset,Django,Django Queryset,我有以下型号: class Person(...): name = CharField(...) class Address(...): person = ForeignKey(Person) address = CharField(...) 我需要选择所有恰好有两个地址的人 因此,如果我的地址表如下所示: ---------------------------- | id | person_id | address | -----------------------
class Person(...):
name = CharField(...)
class Address(...):
person = ForeignKey(Person)
address = CharField(...)
我需要选择所有恰好有两个地址的人
因此,如果我的地址表如下所示:
----------------------------
| id | person_id | address |
----------------------------
| 1 | 1 | xyz |
| 2 | 1 | xyz |
| 3 | 2 | xyz |
| 4 | 3 | xyz |
| 5 | 3 | xyz |
| 6 | 4 | xyz |
| 7 | 5 | xyz |
| 8 | 5 | xyz |
| 9 | 5 | xyz |
----------------------------
生成的查询集应该是
<QuerySet [<Person: 1>, <Person: 3>]>
我试了很多次,但似乎都不对劲。我很乐意提供快速解决方案。尝试使用:
@丹尼尔检查更新。您是否也使用相关的名称?在这种情况下,它应该与名称值相关。@neverballoner您在哪里看到
Person
model有一个address
字段?@albar我看不到。来自django docs related_query_name:默认为related_name的值,如果设置了,则默认为default_related_name,否则默认为模型的名称。因此,在我们的例子中,默认为model_name,address。最好定义您自己的相关名称(提高代码可读性),我会更新address
模型,使其具有person=ForeignKey(person,related_name='address')
然后您可以使用person实例字段my_person.addresses
获取他们的地址。请不要破坏您的帖子。通过在堆栈溢出上发布,您已经为SO授予了不可撤销的权利,以便在下分发该内容。根据SO政策,任何故意破坏行为都将恢复原状。
from django.db.models import Count
Person.objects.annotate(address_count=Count('address')).filter(
address_count=2)