2011-03-21 102 views
5

我想從如下所示的DJango中的兩個相關表的聯接中進行選擇。但我無法獲得另一個表的字段namedjango模型外鍵查詢集選擇相關字段

在SQL我們可以這樣寫:

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

這顯示所有membership領域與phonenumber一起,但在Django它拋出錯誤:

Cannot resolve keyword 'phonenumber' into field

我甚至用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 

回答

16

phonenumberperson場,所以你需要person__phonenumber

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

哈哈,我忘了把person__作爲關係,謝謝一噸yuji – sush 2011-03-21 16:38:43

+0

@Yuji'Tomita'Tomita如果我需要再加入一個值,該怎麼辦?例如,如果Person表中包含我想要查找的地址表Company的外鍵。 我認爲我需要添加值:'person__company__address'。但這對我不起作用。你知道我該怎麼辦? – GileBrt 2018-01-22 12:28:10

+0

@GileBrt這將工作,如果你有一個FK的'Membership'模型與FK到'Company'的'Person'有一個名爲'address'的字段。你可能有一個稍微不同的模型,所以我建議你發佈一個新問題。 – 2018-01-24 07:03:41

1

而且通過如果你想查詢集(所以不要使用值)你可以這樣做:

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

不幸的是,我不知道如何只從該表中獲取一個字段,仍然可以獲取查詢集。

+4

你不能同時擁有字段和深度參數 – aehlke 2013-08-23 19:57:39

+0

通過這樣做,你可以獲得「select_related()得到了一個意想不到的關鍵字論點'深度'「。 它既可以是深度參數,也可以是字段,但不是一次兩個。 – 1ronmat 2017-05-13 10:43:55

相關問題