django查询过滤器选择相关

时间:2013-01-29 00:10:19

标签: django django-queryset

此处的人是从请求中返回的人物对象

PersonAddressBook.objects.select_related().get(person = person).client

上面的代码返回客户端对象如何重写它以返回多个客户端。 一个人对象可能在多人personaddressbook中所以过滤而不是get是我想要做但我想要客户端对象而不使用for-loop

其他模型的外观如何

class Client:
    #stuff here

class Person:
    #stuff here

class PersonAddressBook:
    client = models.ForeignKey(Client)
    person = models.ForeignKey(Person)

这样可行,但需要更长时间并使用更多内存,因为它会加载到我的系统上,我只想使用数据库。

clients =[]
adbook = PersonAddressBook.objects.filter(person = person).select_related()
for contact in adbook:
    clients.append(contact.client)

1 个答案:

答案 0 :(得分:5)

您可以在客户端模型中使用PersonAddressBook的related_name

Client.objects.filter(personaddressbook__person=person)

根据documentation personaddressbook_set__person但由于某些原因,目前我不知道相关名称是以不同方式生成的。)

我更喜欢明确指定related_name

class Client(models.Model):
    pass

class Person(models.Model):
    pass

class PersonAddressBook(models.Model):
    client = models.ForeignKey(Client, related_name='addressbooks')
    person = models.ForeignKey(Person, related_name='addressbooks')

现在,您可以在查询中使用字段addressbooks

Client.objects.filter(addressbooks__person=person)