2016-09-11 119 views
0

你好,我想知道如何創建幾個字段,並將它們轉換成混合。Django模型審計混合

假設我有以下幾點。

class Supplier(models.Model): 
    name = models.CharField(max_length=128) 
    created_by = models.ForeignKey(get_user_model(), related_name='%(class)s_created_by') 
    modified_by = models.ForeignKey(get_user_model(), related_name='%(class)s_modified_by') 
    created_date = models.DateTimeField(editable=False) 
    modified_date = models.DateTimeField() 

    def save(self, *args, **kwargs): 
     if not self.id: 
      self.created_date = timezone.now() 
     self.modified_date = timezone.now() 
     return super(Supplier, self).save(*args, **kwargs) 

我想創建一個mixin,以避免每次將最後4個字段寫入不同的模型。

這裏是我創建的mixin:

class AuditMixin(models.Model): 
    created_by = models.ForeignKey(get_user_model(), related_name='%(class)s_created_by') 
    modified_by = models.ForeignKey(get_user_model(), related_name='%(class)s_modified_by') 
    created_date = models.DateTimeField(editable=False) 
    modified_date = models.DateTimeField() 


    def save(self, *args, **kwargs): 
     if not self.id: 
      self.created_date = timezone.now() 
     self.modified_date = timezone.now() 
     return super(Supplier, self).save(*args, **kwargs) 

class Supplier(AuditMixin): 
    name = models.Charfield(max_length=128) 

我怎樣才能確保related_name是相關的混入被納入類?同樣在save函數中,我如何確保mixin包含到的類返回(按照最後一行)?

謝謝!

回答

2

首先,在任何super調用中,必須使用總是使用當前類。所以它永遠是super(AuditMixin, self)...,你的問題不適用。

如果您使用%(class)s語法,那麼Django本身會替換related_name中的當前類名稱,因此您再也沒有別的辦法了。請參閱the model inheritance docs