我目前正在试验模型混合,其想法是构建一个小型抽象混合类的小型库,定义常用字段。
这是我目前正在玩的东西:
class HtmlAttrsMixin(models.Model):
css_classes = models.CharField(
max_length=256,
verbose_name=_('CSS Classes'),
blank=True,
)
class Meta:
abstract = True
class LinkHtmlAttrsMixin(HtmlAttrsMixin):
target_blank = models.BooleanField(
default=False,
verbose_name=_('Open in a new window /tab'),
)
title = models.CharField(
max_length=512,
verbose_name=_('Title'),
blank=True,
)
class Meta:
abstract = True
class URLMixin(models.Model):
label = models.CharField(
max_length=256,
verbose_name=_('Name'),
blank=True,
)
url = models.CharField(
max_length=4000,
verbose_name=_('URL'),
blank=True,
)
class Meta:
abstract = True
# Concrete model implementing the above mixins:
class TagLine(URLMixin, LinkHtmlAttrsMixin):
enabled = models.BooleanField(_("enabled"), default=True)
def __unicode__(self):
return self.label
到目前为止这工作正常,但有一点我不太明白。
我希望能够通过简单地以不同的顺序声明 mixins 来决定继承字段的顺序。据我所知,默认字段排序基于在模型类上声明的顺序,python 将通过按照列出的顺序遍历基类来解析属性名称,所以在上面例如,我希望css_classes
, target_blank
&title
字段在管理站点中 & 之后列出label
,url
反之亦然,如果我颠倒声明中两个 mixin 的顺序。
但无论我如何列出 mixins,“html_attrs”字段都会首先出现。它们组合在一起(这似乎合乎逻辑,因为它们属于同一类),但我似乎无法以这种方式强制排序。
我知道这是一个微不足道的问题——我可以用一个管理字段集来解决这个问题,无论如何这将证明更加灵活。这似乎是一个方便的技巧,我希望它能起作用,所以我只是想了解它为什么不起作用。
(另外,如果有人对模型混合有任何建议,我会全神贯注——我找到了一些信息,但并不多,而且谷歌django models mixins
往往会返回很多关于 CBV 混合的结果,这不是我想要的。我现在有兴趣)。
感谢任何愿意回答的人!