2010-09-24 22 views
6

मैं एक सामान्य विदेशी कुंजी के साथ संबंध का उपयोग कर एक मॉडल का चयन करने की कोशिश कर रहा हूं, लेकिन यह उम्मीद के अनुसार काम नहीं कर रहा है।Django जेनेरिक विदेशी कुंजी और select_related

मुझे लगता है कि यह बेहतर सचित्र और कोड

class ModelA(models.Model): 
created = models.DateTimeField(auto_now_add=True) 

class ModelB(models.Model): 
instanceA = models.ForeignKey(ModelA) 

content_type = models.ForeignKey(ContentType) 
object_id = models.PositiveIntegerField() 
content_object = generic.GenericForeignKey() 

class ModelC(models.Model): 
number = models.PositiveIntegerField() 
bInstances = generic.GenericRelation(ModelB) 

# Creating an instance of A and C 
aInstance=ModelA.objects.create() 
cInstance=ModelC.objects.create(number=3) 

# Adding instance of C to the B_set of instance A 
aInstance.modelb_set.add(content_object=cInstance) 

# Select all ModelA instances that have C as content object? Does not work 
whatIWant = ModelA.objects.filter(modelb__content_object=modelCInstance) 

# Pseudo-solution, requires calling whatIWant.modelA 
whatIWant = cInstance.bInstances.select_related("modelA") 

बस स्पष्ट होना के साथ समझा जा सकता है, मैं चाहते हैं कि इस लाइन में काम किया: ModelA.objects.filter(modelb__content_object=modelCInstance), जाहिरा तौर पर django फिल्टर रिश्तों पर content_object का उपयोग कर समर्थन नहीं करता।

अग्रिम धन्यवाद!

+0

आप क्या उम्मीद करते हैं? यदि कोई नहीं है तो हम किसी प्रश्न का उत्तर नहीं दे सकते। –

+0

मैंने इसे स्पष्ट करने के लिए पोस्ट संपादित किया है, क्षमा करें – Clash

उत्तर

9

http://www.djangoproject.com/documentation/models/generic_relations/ पर एक नज़र डालें। और कोशिश:

ctype = ContentType.objects.get_for_model(modelCInstance) 
what_you_want = ModelA.objects.filter(modelb__content_type__pk=ctype.id, 
             modelb__object_id=modelCInstance.pk) 

कृपया कुछ Django coding/naming conventions पर एक नज़र अपने कोड को पढ़ने और समझने के लिए करना है,!

+0

युक्तियों के लिए धन्यवाद! क्या यह एकमात्र तरीका है? मैं कुछ और दोस्ताना चाहता था, वैसे भी धन्यवाद! – Clash

+2

चूंकि ContentTypes आदि django कोर का हिस्सा नहीं हैं, इसलिए अंतर्निहित 'फ़िल्टर' इस तरह के प्रश्नों को संभालने का तरीका नहीं जानता है, इसलिए आपको content_type और object_id के लिए स्वयं को फ़िल्टर करना होगा! –

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