2017-08-27 196 views
0

我有這兩款車型只選擇特定的字段:從相關對象的Django

class Command(models.Model): 
    client = models.ForeignKey(Client) 
    carrier = models.ForeignKey(Carrier, null=True, blank=True) 

class Client(models.Model): 
    name = models.CharField(max_length=10) 

    some other fields ... 

我有一個命令類的一個對象,讓我們把它叫做command,讓我們假設我有這對象已經

我想訪問此命令客戶端的name

我可以這樣做:

command.client.name 

但產生的SQL表達式是要獲取客戶端模型的所有領域,而我只需要name

我能做到這一點來解決這個問題:

from client.models import Client 
name = Client.objects.only("name").get(command=command).name 

但是,這是很長的類型,任何快速的方式來做到這一點?像command.client.only("name").name

+0

怎麼能是'Client'是同一型號'Client'的'ForeignKey'的'name'? – Rajez

+0

謝謝我的錯誤,它被糾正了,名字是CharField – paul

回答

0

您可以使用select_related進行此操作,並將其與值鏈接起來。

Command.objects.select_related('client').values('name') 

這將輸出爲一個可以輕鬆引用的字典。

+0

讓我們假設我已經有了命令對象 – paul

+0

如果你用'client_name'替換'name',它仍然會工作 –

+0

yes會起作用, 'Command.objects.select_related (「client」)。values(「client__name」)。get(pk = command.pk)[「client__name」]'但長於Client.objects.only(「name」).get(command = command).name '這已經有點太長了 – paul

0
Command.objects.values('client__name') 

使用雙下劃線來訪問相關實體

+0

我已經擁有命令對象 – paul

+0

如果您有'Command'對象,那麼您可以直接訪問'command.client.name' 。你的期望到底是什麼? – Rajez

+0

是的,這正是我所解釋的,command.client.name將訪問它,但由django ORM生成的SQL請求將獲取客戶端對象的所有字段 – paul