Django:为可重用模型字段创建一个 Mixin

Posted

技术标签:

【中文标题】Django:为可重用模型字段创建一个 Mixin【英文标题】:Django: Creating a Mixin for Reusable Model Fields 【发布时间】:2011-08-26 05:40:46 【问题描述】:

我有几个字段要添加到项目中的大多数模型中。例如,这些字段是“跟踪字段”,例如创建日期、更新日期和“活动”标志。我正在尝试创建一个 Mixin,我可以将它添加到每个模型类中,这样我就可以通过多重继承添加这些额外的字段。但是,当创建对象实例时,通过 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?这种方法有缺陷吗?

感谢您的帮助, 乔

更新:请注意,我计划使用 mixin 的一些模型使用 MPTT 模型,所以我不能简单地将我的 TrackingFieldMixin 混合在基类中并仅从它继承。

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

【问题讨论】:

【参考方案1】:

抽象模型仍然需要从model.Model 继承才能正常工作:

class TrackingFieldsMixin(models.Model):

另外,我会添加一个deleted_on DateTimeField 而不是您的active BooleanField,这样您就可以在删除记录时进行记录。然后,您可以在实例上添加属性以查看它是否处于活动状态:

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

在查询和/或custom manager:

Blog.objects.filter(deleted_on__isnull=True)

【讨论】:

谢谢斯多兰。我能够让它工作。我真的很喜欢您将日期字段用于已删除项目而不是布尔值。很高兴能够跟踪删除和添加。 @Joe J:不客气。是的,在需要之前拥有这些额外信息总是很棒的。此外,我经常存储一个 deleted_by 列用于审计目的,即使我不会马上需要它。

以上是关于Django:为可重用模型字段创建一个 Mixin的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 项目中为可重用应用程序创建基于类的 Celery 任务

我可以在 Django 模型中将外键字段设为可选吗

有没有办法通过 mixin 设置 peewee 字段?

Django Rest框架:序列化程序上的共享字段

如何将 UITableViewController 创建为可重用模块?

子类 Django ModelBase(Django 模型的元类)