2

ここでの人物は、リクエストから返された人物オブジェクトです

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

上記のコードはクライアントオブジェクトを返します。複数のクライアントを返すように書き直すにはどうすればよいですか。個人オブジェクトは複数のpersonaddressbookに含まれている可能性があるため、フィルターを実行して取得しないようにしようとしていますが、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クライアントモデルで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 に答える