[英]Django Model Mixins: inherit from models.Model or from object?
這是一個關於Python Mixins的問題,一般來說可能很有用。 我只是使用Django模型,因為這是我最熟悉的用例。
如果mixin繼承自該類,它是否設計為與'object'混合使用?
代碼示例,更正確或更好,或更好,取決於您想要實現的目標?
這個
class TaggingMixin(models.Model):
tag = models.ForeignKey(Tag)
class Meta:
abstract = True
class MyModel(models.Model, TaggingMixin):
title = models.CharField(max_length=100)
或這個:
class TaggingMixin(object):
tag = models.ForeignKey(Tag)
class Meta:
abstract = True
class MyModel(models.Model, TaggingMixin):
title = models.CharField(max_length=100)
我認為從對象繼承是正確的方法。 但我正在網上看到第一個案例的例子......
編輯:我已將我的后續問題轉移到一個單獨的問題: Django抽象模型與簡單Python混合與Python ABCs
當談到模型類時,Django會做很多元魔術,所以不幸的是,Daniel Roseman的回答中提到的mixins的常用方法 - 它們從object
繼承 - 在Django世界中並不能很好地運行。
使用提供的示例構建mixins的正確方法是:
class TaggingMixin(models.Model):
tag = models.ForeignKey(Tag)
class Meta:
abstract = True
class MyModel(TaggingMixin):
title = models.CharField(max_length=100)
重點是:
model.Model
但配置為抽象類。 model.Model
,您的實際模型不應該繼承它。 如果這樣做,這可能會觸發一致的方法解析順序異常。 我建議它繼承自object
。 這樣,您可以確保它僅提供您實際明確定義的那些方法和屬性。
此外,在定義具體類時,應始終確保將mixin類放在第一位 。 Python的解析規則意味着在類聲明中按照它們的定義順序搜索超類,並且當找到匹配的屬性時,解析停止。 因此,如果你的mixin定義了一個也由主超類定義的方法,那么你的mixin方法就找不到了。
當您從純Python對象繼承時,South不會創建遷移,因此您無法使用此方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.