2015-05-20 9 views
7

में सार मॉडल से संबंधित क्षेत्र मैं इस मॉडल है:ForeignKey Django

class BaseModel(models.Model): 
    .... 

    class Meta: 
     abstract = True 


class ModelA(BaseModel): 
    .... 

class ModelB(BaseModel): 
    .... 


class MyExtModel(models.Model) 
    myfield = models.ForeignKey(BaseModel) 

लेकिन क्योंकि मैं BaseModelAbstract की तरह है यह सही नहीं है। असल में मुझे एक त्रुटि है जब मैं makemigration कमांड का प्रयास करता हूं।

त्रुटि है:

ERRORS: 
myapp.MyExtModel.myfield: (fields.E300) Field defines a relation with model 'BaseModel', which is either not installed, or is abstract. 

वहाँ एक सार बेस मॉडल का उपयोग करने के लिए एक रास्ता है?

मैं भी का उपयोग करने की कोशिश की:

myfield = models.ForeignKey(BaseModel, related_name="%(app_label)s_%(class)s_related") 

उत्तर

6

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 होंगे।

+0

मुझे पॉलिमॉर्फिक मॉडल नहीं पता था ... शायद यह मेरी मदद कर सकता है। मैं एक पहलू को समझ नहीं पा रहा हूं: पॉलिमॉर्फिक मॉडल जेनेरिकरेलेशन पर आधारित है? PolymorphicModel के बजाय जेनेरिकरेलेशन (सामग्री-प्रकार) का उपयोग करने के लिए आवश्यक कब है? शायद यह सवाल मेरे मूल प्रश्न के संदर्भ से बाहर है ... – Safari

+1

सामान्य संबंध पॉलिमॉर्फिक मॉडल से असंबंधित हैं। जेनेरिक संबंध आपके अनुप्रयोगों में जेनेरिक मॉडल के प्रकार के लिए उपयोगी हैं और जिनके पास मौलिक रूप से विभिन्न मॉडल के लिए विदेशी कुंजी हैं। मेरे पास मेरे एप्लिकेशन में एक सामान्य छवि मॉडल है, और इवेंट और टीम मॉडल दोनों में छवियां हो सकती हैं। यह एक सामान्य संबंध है। मेरे पास एक इंटरनेशनल टीम मॉडल भी है जो टीम से विरासत में आता है, और फिर भी टीमों में छवियां होंगी, बिना मुझे मॉडल में स्पष्ट रूप से निर्दिष्ट करना होगा। –

3

जब मैं की तरह एक स्थिति का सामना करना पड़ा है कि मैं कहाँ विभिन्न मॉडलों मैं GenericForeignKey उपयोग करने के लिए तुम यहाँ सरकारी डॉक्स जांच कर सकते हैं चुनने के लिए ForeignKeys करना है: Django ContentTypes: Generic Relations

डॉक्स काफी अच्छी तरह से बताएं कि यह कैसे उपयोग करने के लिए:

from django.db import models 
from django.contrib.contenttypes.fields import GenericForeignKey 
from django.contrib.contenttypes.models import ContentType 

class TaggedItem(models.Model): 
    tag = models.SlugField() 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = GenericForeignKey('content_type', 'object_id') 

    def __str__(self):    # __unicode__ on Python 2 
     return self.tag 
  • क्षेत्र content_type दुकान मॉडल है कि जेनेरिक विदेशी कुंजी

  • क्षेत्र object_id दुकान विदेशी कुंजी की आईडी की ओर इशारा करते है,

  • क्षेत्र content_object आप सीधे करने के लिए उपयोग करने के लिए मदद करता है संबंधित अन्य 2 क्षेत्रों के आधार पर वस्तु

यह सबसे अच्छा समाधान नहीं है बल्कि यह मुझे कुछ परियोजनाओं में बचत होती है

+०१२३५१६४१०

इसे प्रयोग का उदाहरण:

from django.contrib.auth.models import User 
guido = User.objects.get(username='Guido') 
t = TaggedItem(content_object=guido, tag='bdfl') 
t.save() 
t.content_object 
<User: Guido> 
1

अलावा GenericForeignKey साथ अच्छा जवाब है, जिसके साथ मैं काफी परिचित है, कभी कभी नहीं हूँ से (बस कभी कभी, जब भी संभव हो), यह बंद का भुगतान करती है एक- उपयोग करने के साथ अपने मॉडल को आसान बनाने के आपके 'बेस' मॉडल से एक रिश्ते।

उसके बाद विदेशी कुंजी प्रबंधन आसान बनाता है। अगर मुझे अच्छी तरह याद है, तो एक अमूर्त वर्ग पर विदेशी कुंजी संभव नहीं है।

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