2015-12-22 5 views
8

के लिए दो रिवर्स रिश्ते बनाता है यह मेरा मॉडल है:एक रिश्ता एक Django सार कक्षा का उपयोग कर बनाया जा रहा है और उस वर्ग इनहेरिट किसी कारण

class Post(models.Model): 
    owner = models.ForeignKey(User, related_name="%(app_label)s%(class)s_set") 
    post = models.CharField(max_length=400) 

    class Meta: 
     abstract = True 


class DS(Post): 
    location = models.ForeignKey(Location, blank=True, null=True, related_name="%(app_label)s%(class)s_set") 

    class Meta(Post.Meta): 
     abstract = True 

class S(DS): 
    # same as DS 
    pass 

अब, जब मैं अजगर खोल खुल जाएगा और ऐसा करते हैं:

a = User.objects.get(username='a') 
dir(a) 

तब इन दोनों दिखाई देते हैं:

['myapps_set', 's_set'] 

और मुझे क्या करना है जब:

a.s_set.all() 

यह एक S वस्तु देता है, लेकिन जब जब मैं कार्य करें:

a.myapps_set.all() 

यह तीन S वस्तुओं रिटर्न (प्रथम S वस्तु यह रिटर्न वही जो वापस आ गया था जब मैं a.s_set.all() करते हैं। मेरे दो प्रश्न हैं,

1) जब भी मैंने विशेष रूप से owner = models.ForeignKey(User, related_name="%(app_label)s%(class)s_set") किया, तो s_set उपयोगकर्ता ऑब्जेक्ट के साथ उपयोग करने में सक्षम है?

2) कि वे किस तरह की वस्तुओं के दो अलग सेट लौट आते हैं (यानी कैसे myapps_set.all() रिटर्न 3 (सही जवाब आते हैं) जबकि s_set.all() केवल रिटर्न एक?

+1

django का कौन सा संस्करण ..? – Satyajeet

+0

@ सट्टाजीत Django 1.8 – user2719875

उत्तर

4

मैं सिर्फ Django == 1.8 पर साथ आप कोड परीक्षण किया है स्वच्छ आभासी वातावरण और केवल एक ही रिवर्स संबंध मिला

$ pip freeze 
decorator==4.0.6 
Django==1.8 
ipython==4.0.1 
ipython-genutils==0.1.0 
path.py==8.1.2 
pexpect==4.0.1 
pickleshare==0.5 
ptyprocess==0.5 
simplegeneric==0.8.1 
traitlets==4.0.0 
wheel==0.24.0 

$./manage.py shell 
In [1]: from django.contrib.auth.models import User 
In [2]: a = User.objects.all()[0] 
In [3]: [item for item in sorted(dir(a)) if 'tutu' in item or item.startswith('s') and not item.startswith('_')] 
Out[3]: 
['save', 
'save_base', 
'serializable_value', 
'set_password', 
'set_unusable_password', 
'tutus_set'] 

यहाँ कोड है:। https://www.dropbox.com/s/rsej26d70swyllr/stack34406825.tar.gz?dl=0

ऐसा लगता है कि आप Django के अपने स्थानीय संस्करण के साथ कुछ किया है या आप श है यहां सभी कोड नहीं हैं।

+0

आह, दिलचस्प। ठीक है, आप कोशिश कर पाएंगे 1) शुरुआत में एस मॉडल बनाना जब यह किसी भी चीज़ से प्राप्त नहीं होता है (इसके बजाय, इसकी अपनी 'मालिक' संपत्ति है), 2) माइग्रेशन करें, और फिर 3) पोस्ट और डीएस में जोड़ें मॉडल और 4) डी को डीएस से प्राप्त करने के लिए मिलता है और फिर एक और माइग्रेशन करते हैं? क्या अब आपके लिए s_set और appnames_set दिखाए गए हैं? मुझे लगता है कि समस्या केवल मेरे लिए होती है क्योंकि शायद मैंने शुरुआत में विरासत के बिना प्रवास किया था, और मैं बस इसके बारे में भूल गया। – user2719875

+0

जब मैं नियमित मॉडल बदलता हूं "./manage.py makemigrations app_name" कमांड कहता है कि मॉडल में कोई बदलाव नहीं है। तो मैं तुम्हारा उपयोग केस नहीं देख सकता। –

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