以 DRY 方式创建活动/存档模型 (Django)

Posted

技术标签:

【中文标题】以 DRY 方式创建活动/存档模型 (Django)【英文标题】:Create Active/Archive Models in a DRY way (Django) 【发布时间】:2012-04-18 07:19:39 【问题描述】:

我有一个像下面这样的模型,它变得太大,需要拆分成一个单独的活动表。一天结束时,一个表将包含所有对象,而另一个表将仅包含活动对象。

   class Tickets(models.Model):
        price = ....
        number = .....
        date = ....
        active = ....
        parent = models.ForeignKey('self', related_name='children')

        ManyMoreFields

复杂性有两个来源:

1) ActiveTickets 表的父字段将指向Tickets 表。 related_name 不应更改。

2) ActiveTickets 和 Tickets 表都有从它们继承的代理模型。

     class CityTickets(Tickets):

          class Meta:
             proxy = True


     class ActiveCityTickets(ActiveTickets):
          class Meta:
             proxy = True

显然,我可以复制并粘贴 Ticket 中的所有字段(有很多),但这不是正确的做法。我尝试使用抽象继承和 Mixins(在一个单独的类中定义字段,该类由门票和 ActiveTickets 继承)。

抽象继承的一个问题是 ForeignKey 字段 parent 会导致问题,因为它是重复的,并且 related_name 是相同的。通常,我的尝试导致我的单元和功能测试失败。

这里有哪些优雅的方法?我是否应该考虑创建两个单独的 mysql 表,然后只使用具有多个管理器(和 db 路由器)的单个模型?这合理吗?

【问题讨论】:

【参考方案1】:

也许这会有所帮助:

class Base(models.Model):
    m2m = models.ManyToManyField(OtherModel, related_name="%(app_label)s_%(class)s_related")

    class Meta:
        abstract = True

https://docs.djangoproject.com/en/dev/topics/db/models/#be-careful-with-related-name

【讨论】:

嘿威廉,我不确定这是否能完整回答我的问题,但这是一个很好的链接。我以前从未见过 Django 文档的那一部分。谢谢!

以上是关于以 DRY 方式创建活动/存档模型 (Django)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Django 模型字段定义保持 DRY

Rails:使用范围来显示模型的不同子集以及如何以较少 DRY 的方式构建它?

Rails 以 DRY 形式链接模型

Django/Python DRY:使用 Q 对象和模型属性时如何避免重复代码

如何以 DRY 方式基于 current_page 将“活动”类应用于我的导航? - 导轨 3

在多个 django 模板文件中显示相同 html 块的最佳 DRY 方法