2017-08-27 154 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