( अपडेट : Django 1.2 और नए के लिए, जो रिवर्स OneToOneField संबंधों (और इस प्रकार वंशानुगत पदानुक्रम) में select_related प्रश्नों का अनुसरण कर सकता है, वहां एक बेहतर तकनीक उपलब्ध है, जिसे real_type
मूल मॉडल पर जोड़े गए फ़ील्ड की आवश्यकता नहीं है । यह InheritanceManager के रूप में उपलब्ध है। django- मॉडल-बर्तन परियोजना।)
ऐसा करने का सामान्य तरीका पेरेंट मॉडल पर कंटेंट टाइप में फॉरेनके को जोड़ना है जो उचित "लीफ" क्लास के कंटेंट टाइप को स्टोर करता है। इसके बिना, आपको उदाहरण खोजने के लिए बच्चे की तालिकाओं पर बहुत सारे प्रश्न करने पड़ सकते हैं, यह निर्भर करता है कि आपका वंशानुक्रम वृक्ष कितना बड़ा है। यहाँ मैंने इसे एक परियोजना में कैसे किया है:
from django.contrib.contenttypes.models import ContentType
from django.db import models
class InheritanceCastModel(models.Model):
"""
An abstract base class that provides a ``real_type`` FK to ContentType.
For use in trees of inherited models, to be able to downcast
parent instances to their child types.
"""
real_type = models.ForeignKey(ContentType, editable=False)
def save(self, *args, **kwargs):
if self._state.adding:
self.real_type = self._get_real_type()
super(InheritanceCastModel, self).save(*args, **kwargs)
def _get_real_type(self):
return ContentType.objects.get_for_model(type(self))
def cast(self):
return self.real_type.get_object_for_this_type(pk=self.pk)
class Meta:
abstract = True
इसे पुन: प्रयोज्य बनाने के लिए एक सार आधार वर्ग के रूप में लागू किया गया है; आप इन विधियों और FK को सीधे अपने विशेष वंशानुक्रम पदानुक्रम में मूल वर्ग पर भी डाल सकते हैं।
यदि आप मूल मॉडल को संशोधित करने में सक्षम नहीं हैं तो यह समाधान काम नहीं करेगा। उस स्थिति में आप मैन्युअल रूप से सभी उपवर्गों की जाँच कर रहे हैं।