以 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)的主要内容,如果未能解决你的问题,请参考以下文章
Rails:使用范围来显示模型的不同子集以及如何以较少 DRY 的方式构建它?
Django/Python DRY:使用 Q 对象和模型属性时如何避免重复代码