【问题标题】:django model foreign key queryset selecting related fieldsdjango模型外键查询集选择相关字段
【发布时间】:2011-03-21 16:25:24
【问题描述】:

我正在尝试从 DJango 中两个相关表的连接中进行选择,如下所示。但我无法获取另一张表的字段name

在 SQL 中我们可以这样写:

select person.phonenumber,membership.* from membership where person=name ;

这会显示所有 membership 字段以及 phonenumber,但在 Django 中会抛出错误:

无法将关键字“电话号码”解析为字段

我什至尝试过select_related,但没有用。我做错什么了吗?

model.py:

from django.db import models

# Create your models here.
class Person(models.Model):
    name = models.CharField(primary_key=True,max_length=128)
    phonenumber = models.CharField(max_length=128)
    city = models.CharField(max_length=128)


    def __unicode__(self):
        return self.name

class Membership(models.Model):
    person = models.ForeignKey(Person)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)


>>> print m.query
SELECT `myapp_membership`.`id`, `myapp_membership`.`person_id`, `myapp_membership`.`date_joined`, `myapp_membership`.`invite_reason` FROM `myapp_membership` WHERE `myapp_membership`.`person_id` = x 
>>> m=Membership.objects.filter(person__name='x').select_related()
>>> print m.query
SELECT `myapp_membership`.`id`, `myapp_membership`.`person_id`, `myapp_membership`.`date_joined`, `myapp_membership`.`invite_reason`, `myapp_person`.`name`, `myapp_person`.`phonenumber`, `myapp_person`.`city` FROM `myapp_membership` INNER JOIN `myapp_person` ON (`myapp_membership`.`person_id` = `myapp_person`.`name`) WHERE `myapp_membership`.`person_id` = x 
>>> m=Membership.objects.filter(person__name='x').values('person','phonenumber').select_related()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python2.6/dist-packages/Django-1.2.4-py2.6.egg/django/db/models/query.py", line 510, in values
    return self._clone(klass=ValuesQuerySet, setup=True, _fields=fields)
  File "/usr/local/lib/python2.6/dist-packages/Django-1.2.4-py2.6.egg/django/db/models/query.py", line 766, in _clone
    c._setup_query()
  File "/usr/local/lib/python2.6/dist-packages/Django-1.2.4-py2.6.egg/django/db/models/query.py", line 889, in _setup_query
    self.query.add_fields(self.field_names, False)
  File "/usr/local/lib/python2.6/dist-packages/Django-1.2.4-py2.6.egg/django/db/models/sql/query.py", line 1537, in add_fields
    "Choices are: %s" % (name, ", ".join(names)))
FieldError: Cannot resolve keyword 'phonenumber' into field. Choices are: date_joined, id, invite_reason, person

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    phonenumberperson上的一个字段,所以需要传入person__phonenumber

    m=Membership.objects.filter(person__name='x').values('person','person__phonenumber').
    

    【讨论】:

    • @Yuji 'Tomita' Tomita 如果我需要在值中再包含一个联接怎么办?例如,如果 Person 表包含我要查找的地址的 Company 表的外键。我假设我需要添加值:'person__company__address'。但这对我不起作用..你知道我该怎么办吗?
    • @GileBrt 如果你有一个 Membership 模型,FK 到 Person,FK 到 Company 并带有一个名为 address 的字段。您的模型可能略有不同,因此我建议您发布一个新问题。
    • @Yuji 'Tomita' Tomita 正如你所描述的,在我的情况下有一个外键。当这样做时,它是有效的,你是对的。但是,我真正需要的是对 .values 中提到的这些属性求和某个值(如 sql 中的 group by)。我在想,如果我只是将“.annotate(total_value=Sum('a_value'))” 添加到您已经写的内容中,我就可以做到这一点,但是这种值 'person__company__address' 不起作用。
    • @GileBrt 你真的需要发布一个新问题 - 这个想法不适合 cmets。如果你写一个关于模型的正确问题,你正在尝试什么等,我很乐意提供帮助。
    【解决方案2】:

    另外,如果你想要一个查询集(所以不要使用值),你可以这样做:

    m=Membership.objects.filter(person__name="x").select_related('person', depth=1)
    

    遗憾的是,我不知道如何只从该表中获取一个字段并仍然获得一个查询集。

    【讨论】:

    • 你不能同时拥有字段和深度参数
    • 通过这样做你会得到“select_related() got an unexpected keyword argument 'depth'”。它可以是深度参数或字段,但不能同时使用两个。
    猜你喜欢
    • 1970-01-01
    • 2014-01-18
    • 2015-08-31
    • 1970-01-01
    • 2020-07-31
    • 2020-03-05
    • 1970-01-01
    • 2013-11-09
    • 2017-05-14
    相关资源
    最近更新 更多