2011-05-16 18 views
17

मेरे पास कुछ फ़ील्ड हैं जिन्हें मैं अपने प्रोजेक्ट में सबसे अधिक मॉडल में जोड़ना चाहता हूं। उदाहरण के लिए, ये फ़ील्ड "ट्रैकिंग फ़ील्ड" जैसे एक निर्मित दिनांक, एक अद्यतन दिनांक और एक "सक्रिय" ध्वज हैं। मैं एक मिक्सिन बनाने का प्रयास कर रहा हूं जिसे मैं प्रत्येक मॉडल वर्ग में जोड़ सकता हूं जो मुझे इन अतिरिक्त क्षेत्रों को एकाधिक विरासत के माध्यम से जोड़ने की अनुमति देगा। हालांकि, जब कोई ऑब्जेक्ट इंस्टेंस बनाया जाता है, तो ऐसा लगता है कि मिक्सिन के माध्यम से जोड़े गए मेरे मॉडल फ़ील्ड डेटाबेस फ़ील्ड के बजाए ऑब्जेक्ट के तरीकों के रूप में दिखाई देते हैं।Django: पुन: प्रयोज्य मॉडल फ़ील्ड के लिए एक मिक्सिन बनाना

from django.db import models 

class Blog(models.Model, TrackingFieldMixin): 
    name = models.CharField(max_length=64) 
    type = models.... 


class TrackingFieldsMixin(): 

    active = models.BooleanField(default=True, 
     help_text=_('Indicates whether or not this object has been deleted.')) 
    created = models.DateTimeField(auto_now_add=True) 
    modified = models.DateTimeField(auto_now=True) 

    class Meta: 
     abstract = True 

तो यह काम करने के लिए प्रकट नहीं होता है:

In [18]: Blog.objects.all()[0].created 
Out[18]: <django.db.models.fields.DateTimeField object at 0x10190efd0> 

यहाँ मेरी मॉडल कैसे दिखाई देते है। क्या किसी को पता है कि मैं ऊपर के समान मॉडल मॉडल के लिए पुन: प्रयोज्य मिश्रण कैसे बना सकता हूं? क्या इस दृष्टिकोण में कोई दोष है?

आप के लिए धन्यवाद मदद, जो

अद्यतन: ध्यान दें कि अपने मॉडल में से कुछ है कि मैं की योजना उपयोग में mixin MPTT मॉडल का उपयोग करने के लिए, तो मैं बस आधार वर्ग Mixin मेरी TrackingFieldMixin नहीं कर सकते हैं और केवल इससे प्राप्त होता है।

class Post(MPTTModel, TrackingFieldMixin): 
    post_name = models.... 
    post_type = models... 

उत्तर

24

सार मॉडल अभी भी model.Model से इनहेरिट करना सही ढंग से काम करने की जरूरत है:

class TrackingFieldsMixin(models.Model): 

बजाय इसके अलावा अपने activeBooleanField मैं एक deleted_onDateTimeField ताकि आप रिकॉर्ड कर सकते हैं जब रिकॉर्ड नष्ट कर दिया गया जोड़ना होगा। आप तो बस अगर सक्रिय रहने के दौरान देखने के लिए उदाहरण पर गुण जोड़ सकते हैं:

@property 
def active(self): 
    return self.deleted_on is None 

और प्रश्नों में और/या एक custom manager:

Blog.objects.filter(deleted_on__isnull=True) 
+0

धन्यवाद Sdolan। मैं इसे काम करने में सक्षम था। मुझे वास्तव में बूलियन के बजाय हटाए गए आइटमों के लिए दिनांक फ़ील्ड का उपयोग पसंद है। Deletes के साथ ही जोड़ों को ट्रैक करने में सक्षम होने के लिए अच्छा है। –

+0

@ जो जे: आपका बहुत स्वागत है। और हां, इसकी आवश्यकता होने से पहले उस अतिरिक्त जानकारी को हमेशा रखना बहुत अच्छा होता है। साथ ही, मैं अक्सर ऑडिटिंग उद्देश्यों के लिए हटाए गए_बी कॉलम को संग्रहीत करता हूं, भले ही मुझे इसकी आवश्यकता नहीं होगी। – sdolan

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