2011-03-21 6 views
5

다음과 같이 DJango에서 두 개의 관련 테이블 조인을 선택하려고합니다. 그러나 나는 다른 테이블의 name 필드를 얻을 수 없습니다.django 모델 외래 키 쿼리 세트 관련 필드 선택

SQL에서 우리는 쓸 수 있습니다 :

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

phonenumber과 함께 모든 membership 필드를 표시하지만 장고에 오류가 발생합니다 :

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

haaa, 관계로 사람을 쓰는 걸 잊었어요, 유조선 덕분에 – sush

+0

@Yuji 'Tomita'Tomita 내가 더 많은 가치에 참여할 필요가 있다면? 예를 들어, Person 테이블에 Company Company 테이블에 대한 외래 키가 포함되어있는 경우 어떤 주소를 찾고 싶습니까? 필자는 'person__company__address'값을 추가해야한다고 생각했습니다. 그러나 이것은 나를 위해 작동하지 않습니다 .. 내가 뭘해야하는지 알아? – GileBrt

+0

@GileBrt '회원'모델에 FK가있는 '사람'과 FK가 '회사'이고 주소가 '필드'인 경우 사용할 수 있습니다. 모델이 약간 다를 수 있으므로 새 질문을 게시하는 것이 좋습니다. –

1

에 전달해야) 이것을 할 수 있습니다 :

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

슬프게도 나는 그 테이블에서 하나의 필드 만 얻고 여전히 쿼리 세트를 얻는 방법을 모른다.

+4

필드와 깊이 매개 변수 – aehlke

+0

을 모두 가질 수는 없습니다. "select_related() 예기치 않은 키워드가 있습니다. 인수 '깊이'. " 깊이 매개 변수 또는 필드 중 하나이지만 한 번에 두 개가 아닙니다. – 1ronmat