2

这里的人是请求返回的一个人对象

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

上面的代码返回客户端对象,我如何重写它以返回多个客户端。一个人对象可能在多个人地址簿中,所以过滤而不是获取是我想要做的,但我想要客户端对象而不使用 for 循环

还有其他型号的外观

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)
4

1 回答 1

5

您可以related_name在 Client 模型中使用 PersonAddressBook :

Client.objects.filter(personaddressbook__person=person)

根据文档,它应该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)
于 2013-01-29T00:14:33.047 回答