2011-03-21 24 views
5

मैं नीचे दिखाए गए डीजेंगो में दो संबंधित तालिकाओं के शामिल होने से चयन करने का प्रयास कर रहा हूं। लेकिन मैं अन्य तालिका के क्षेत्र name प्राप्त करने में सक्षम नहीं हूं।django मॉडल विदेशी कुंजी क्वेरीसेट संबंधित क्षेत्रों का चयन

एसक्यूएल में हम लिख सकते हैं:

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

यह phonenumber के साथ-साथ सभी membership फ़ील्ड दिखाई देते हैं, लेकिन 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

हा, मैं व्यक्ति को संबंध के रूप में रखना भूल गया, धन्यवाद एक टन यूजी – sush

+0

@ युजी 'टोमिता' टोमिता क्या होगा यदि मुझे मूल्यों में एक और शामिल करने की आवश्यकता है? उदाहरण के लिए यदि व्यक्ति तालिका में टेबल कंपनी के लिए विदेशी कुंजी है जो पता है कि मैं ढूंढना चाहता हूं। मुझे लगता है कि मुझे मूल्यों में जोड़ना होगा: 'person__company__address'। लेकिन यह मेरे लिए काम नहीं करता .. क्या आपको पता है मुझे क्या करना चाहिए? – GileBrt

+0

@GileBrt जो काम करेगा यदि आपके पास 'पता' नामक फ़ील्ड के साथ एफके के साथ 'कंपनी' के लिए 'व्यक्ति' के साथ 'सदस्य' के साथ 'सदस्यता' मॉडल था। आपके पास थोड़ा अलग मॉडल हो सकता है, इसलिए मैं आपको एक नया प्रश्न पोस्ट करने की सलाह देता हूं। –

1

इसके अलावा में पारित करने के लिए की जरूरत है अगर आप एक क्वेरीसमूह चाहते हैं (तो मानों का उपयोग नहीं) आप यह कर सकते हैं:

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

दुख की बात है कि मुझे नहीं पता कि उस तालिका से केवल एक फ़ील्ड कैसे प्राप्त करें और अभी भी एक क्वेरीसेट प्राप्त करें।

+4

आपके पास फ़ील्ड और गहराई परम नहीं हो सकता है – aehlke

+0

ऐसा करने से आप "select_related() को एक अप्रत्याशित कीवर्ड प्राप्त कर सकते हैं तर्क 'गहराई' "। यह या तो गहराई परम या क्षेत्र है, लेकिन दो बार एक बार नहीं। – 1ronmat

संबंधित मुद्दे