Django模型审计mixin

时间:2016-09-11 16:12:19

标签: django python-2.7 django-models

您好我想知道如何创建一些字段并将它们转换为mixin。

我们说我有以下内容。

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与mixin包含在的类相关?同样在保存功能中,如何确保返回包含mixin的类(按照最后一行)?

谢谢!

1 个答案:

答案 0 :(得分:2)

首先,在任何super调用中,您必须始终使用当前类。因此它始终为super(AuditMixin, self)...,您的问题不适用。

如果您使用related_name语法,Django本身会在%(class)s中替换当前的类名,所以再没有其他任何事情要做。请参阅the model inheritance docs