2011-03-21 37 views
5

Aşağıda gösterildiği gibi DJango'daki ilgili iki tablodan birleşimden seçim yapmaya çalışıyorum. Ancak diğer tablonun name alanını alamıyorum.django model yabancı anahtar queryset ilgili alanları seç

SQL biz yazabiliriz:

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

Bu phonenumber birlikte tüm membership alanları görüntüler, ancak Django hatayı atar:

Cannot resolve keyword 'phonenumber' into field

Hatta select_related ama hiçbir kullanımı ile çalıştık . Yanlış bir şey yapıyorum?

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 

cevap

16

phonenumberperson bir alandır, yani (şimdiye değerleri kullanmak değil Sorgu Kümesi istiyorsanız Ayrıca person__phonenumber

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

haaa, person__'yi ilişki olarak eklemeyi unuttum, teşekkürler ton yuji – sush

+0

@Yuji 'Tomita' Tomita Değerlere bir tane daha katılmalı mıyım? Örneğin, Kişi tablosu, bulmak istediğim adrese Şirket tablosuna yabancı anahtar içeriyorsa. Değerleri eklemem gerektiğini varsaydım: 'person__company__address'. ama bu benim için çalışmıyor .. Ne yapmalıyım biliyor musunuz? – GileBrt

+0

@GileBrt, "Üyelik" isimli bir "Üyelik" modelinin FK ile "Kişi" nin FK ile "Şirket" alanına "adres" adlı bir alana sahip olsaydı işe yarayacaktı. Muhtemelen biraz farklı bir modeliniz var, bu yüzden yeni bir soru göndermenizi tavsiye ederim. –

1

içinde geçmesi gerekiyor) Bunu yapabilirsiniz:

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

Maalesef bu tablodan sadece bir alanın nasıl alınacağını bilmiyorum ve hala bir queryset olsun.

+4

, hem alan hem de derinlik param – aehlke

+0

yapamazsınız, bunu yaptığınızda "select_related()" argüman 'derinlik'. Bu, ya derinlik param ya da alan, ancak iki kez değil. – 1ronmat

İlgili konular