Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 返回相关模型精确引用两次的所有对象_Django_Django Queryset - Fatal编程技术网

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)