2011-05-16 46 views
17

我有幾個字段,我想添加到我的項目中的大多數每個模型。例如,這些字段是「跟蹤字段」,例如創建日期,更新日期和「活動」標誌。我試圖創建一個Mixin,我可以將它添加到每個模型類中,以允許我通過多重繼承添加這些額外的字段。但是,創建對象實例時,似乎通過Mixin添加的模型字段顯示爲對象的方法而不是數據庫字段。Django:爲可重用模型字段創建Mixin

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

這裏是我的模型是這樣的:

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 

因此,這似乎並沒有工作。有誰知道我如何能夠爲類似於上面的常見模型字段創建可重用的mixin?這種方法有缺陷嗎?

感謝您的幫助, 喬

更新:請注意,我的一些模型,我打算使用在使用混入了MPTT模型,所以我不能只是讓我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。我能夠得到它的工作。我真的很喜歡你使用日期字段刪除項目,而不是布爾值。很好能夠跟蹤刪除和添加。 – 2011-05-16 14:53:46

+0

@Joe J:你很受歡迎。是的,在需要之前獲得額外的信息總是很棒的。另外,爲了審計目的,我經常存儲一個deleted_by列,即使我不會馬上需要它。 – sdolan 2011-05-16 22:48:20