2009-05-19 15 views
29

मैं एक एकल ForeignKey को दो अलग-अलग मॉडल से कनेक्ट करना चाहता हूं।Django में गतिशील विदेशीकी का उपयोग कैसे करें?

उदाहरण के लिए:

मैं Casts और Articles नामित दो मॉडल, और एक तीसरे मॉडल, Faves, अन्य मॉडलों में से किसी पसंदीदा बनाना के लिए की है। मैं ForeignKey गतिशील कैसे बना सकता हूं?

class Articles(models.Model): 
    title = models.CharField(max_length=100) 
    body = models.TextField() 

class Casts(models.Model): 
    title = models.CharField(max_length=100) 
    body = models.TextField() 

class Faves(models.Model): 
    post = models.ForeignKey(**---CASTS-OR-ARTICLES---**) 
    user = models.ForeignKey(User,unique=True) 

क्या यह संभव है?

उत्तर

37

यहाँ है कैसे मैं यह कर:

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


class Photo(models.Model): 
    picture = models.ImageField(null=True, upload_to='./images/') 
    caption = models.CharField(_("Optional caption"),max_length=100,null=True, blank=True) 

    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = fields.GenericForeignKey('content_type', 'object_id') 

class Article(models.Model): 
    .... 
    images  = fields.GenericRelation(Photo) 
कुछ

आप जोड़ना होगा

तरह
content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = fields.GenericForeignKey('content_type', 'object_id') 
Faves को

और अनुच्छेद को

fields.GenericRelation(Faves) 

और कास्ट

contenttypes docs

15

यहां एक दृष्टिकोण है। (ध्यान दें कि मॉडल विलक्षण हैं, Django आपके लिए अपने आप pluralizes।)

class Article(models.Model): 
    title = models.CharField(max_length=100) 
    body = models.TextField() 

class Cast(models.Model): 
    title = models.CharField(max_length=100) 
    body = models.TextField() 

FAVE_CHOICES = ( 
    ('A','Article'), 
    ('C','Cast'), 
) 
class Fave(models.Model): 
    type_of_fave = models.CharField(max_length=1, choices=FAVE_CHOICES) 
    cast = models.ForeignKey(Casts,null=True) 
    article= models.ForeigKey(Articles,null=True) 
    user = models.ForeignKey(User,unique=True) 

यह बहुत ही कम गहरा समस्याओं प्रस्तुत करता है। आपके उपयोग के मामलों के आधार पर इसे कुछ चालाक वर्ग विधियों की आवश्यकता हो सकती है।

+10

+1 मुझे लगता है कि जेनेरिक सामग्री प्रकार, स्वीकृत उत्तर के रूप में, "प्लग करने योग्य" मॉडल के लिए बेहतर हैं जहां आप संबंधों के बारे में कुछ नहीं जानते हैं। आपका उत्तर उन परिस्थितियों के लिए बेहतर है जहां आपके पास सभी मॉडलों का नियंत्रण और पूर्ण ज्ञान है। डेटाबेस पर प्रश्नों और कम हिट लिखना बेहतर है। –

+2

आप कास्ट और आलेख में "null = True" भूल गए हैं FK फ़ील्ड तर्क देता है क्योंकि प्रत्येक फ़ेव इंस्टेंस केवल एक FK फ़ील्ड को कोई भी नहीं सेट करेगा जो type_of_fave फ़ील्ड में सेटिंग से मेल खाता है – Geradeausanwalt

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