Django में अमूर्त मॉडल के लिए विदेशी कुंजी स्थापित करना संभव नहीं है। हालांकि आप एक गैर सार आधार वर्ग के लिए विदेशी कुंजी स्थापित कर सकते हैं। एकमात्र सीमा यह है कि रिवर्स विदेशी कुंजी संबंध आधार वर्ग के उदाहरण वापस कर देगा। आप django-polymorphic का उपयोग करके इस सीमा को बाधित कर सकते हैं।
Django बहुरूपी आप आधार वर्ग वस्तुओं क्वेरी करने के लिए अनुमति देता है, लेकिन बच्चे वर्ग उदाहरणों को पुन: प्राप्त:
>>> Project.objects.create(topic="Department Party")
>>> ArtProject.objects.create(topic="Painting with Tim", artist="T. Turner")
>>> ResearchProject.objects.create(topic="Swallow Aerodynamics", supervisor="Dr. Winter")
>>> Project.objects.all()
[ <Project: id 1, topic "Department Party">,
<ArtProject: id 2, topic "Painting with Tim", artist "T. Turner">,
<ResearchProject: id 3, topic "Swallow Aerodynamics", supervisor "Dr. Winter"> ]
उपयोग करने के लिए Django बहुरूपी आप केवल आधार वर्ग के रूप में बहुरूपी मॉडल के साथ अपने मॉडल की घोषणा करने की जरूरत है:
from django.db import models
from polymorphic.models import PolymorphicModel
class ModelA(PolymorphicModel):
field1 = models.CharField(max_length=10)
class ModelB(ModelA):
field2 = models.CharField(max_length=10)
class ModelC(ModelB):
field3 = models.CharField(max_length=10)
विदेशी कुंजी भी बच्चे को कक्षा उदाहरणों वापस आ जाएगी, जो आपको क्या चाहिए मुझे लगता है:
# The model holding the relation may be any kind of model, polymorphic or not
class RelatingModel(models.Model):
many2many = models.ManyToManyField('ModelA') # ManyToMany relation to a polymorphic model
>>> o=RelatingModel.objects.create()
>>> o.many2many.add(ModelA.objects.get(id=1))
>>> o.many2many.add(ModelB.objects.get(id=2))
>>> o.many2many.add(ModelC.objects.get(id=3))
>>> o.many2many.all()
[ <ModelA: id 1, field1 (CharField)>,
<ModelB: id 2, field1 (CharField), field2 (CharField)>,
<ModelC: id 3, field1 (CharField), field2 (CharField), field3 (CharField)> ]
ध्यान रखें कि ये प्रश्न slightly less performant होंगे।
मुझे पॉलिमॉर्फिक मॉडल नहीं पता था ... शायद यह मेरी मदद कर सकता है। मैं एक पहलू को समझ नहीं पा रहा हूं: पॉलिमॉर्फिक मॉडल जेनेरिकरेलेशन पर आधारित है? PolymorphicModel के बजाय जेनेरिकरेलेशन (सामग्री-प्रकार) का उपयोग करने के लिए आवश्यक कब है? शायद यह सवाल मेरे मूल प्रश्न के संदर्भ से बाहर है ... – Safari
सामान्य संबंध पॉलिमॉर्फिक मॉडल से असंबंधित हैं। जेनेरिक संबंध आपके अनुप्रयोगों में जेनेरिक मॉडल के प्रकार के लिए उपयोगी हैं और जिनके पास मौलिक रूप से विभिन्न मॉडल के लिए विदेशी कुंजी हैं। मेरे पास मेरे एप्लिकेशन में एक सामान्य छवि मॉडल है, और इवेंट और टीम मॉडल दोनों में छवियां हो सकती हैं। यह एक सामान्य संबंध है। मेरे पास एक इंटरनेशनल टीम मॉडल भी है जो टीम से विरासत में आता है, और फिर भी टीमों में छवियां होंगी, बिना मुझे मॉडल में स्पष्ट रूप से निर्दिष्ट करना होगा। –