簡體   English   中英

Django Model Mixins:繼承自models.Model還是來自對象?

[英]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)

重點是:

  • Mixins繼承自model.Model但配置為抽象類。
  • 由於混入繼承model.Model ,您的實際模型應該繼承它。 如果這樣做,這可能會觸發一致的方法解析順序異常。

我建議它繼承自object 這樣,您可以確保它僅提供您實際明確定義的那些方法和屬性。

此外,在定義具體類時,應始終確保將mixin類放在第一位 Python的解析規則意味着在類聲明中按照它們的定義順序搜索超類,並且當找到匹配的屬性時,解析停止。 因此,如果你的mixin定義了一個也由主超類定義的方法,那么你的mixin方法就找不到了。

這看起來像抽象模型的工作

編輯:

那些不是mixins本身。 或者說,他們不需要。 您可以直接從抽象模型派生。

當您從純Python對象繼承時,South不會創建遷移,因此您無法使用此方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM