【问题标题】:How do I implement a common interface for Django related object sets?如何为 Django 相关对象集实现通用接口?
【发布时间】:2010-10-05 15:14:07
【问题描述】:

这是交易:

我有两个数据库模型,比如说ShoppingCartOrder。遵循 DRY 原则,我想将一些常见的道具/方法提取到共享接口ItemContainer

一切都很顺利,直到我遇到了 _flush() 方法,该方法主要对相关对象集执行删除操作。

class Order(models.Model, interface.ItemContainer):

# ...

def _flush(self):
    # ...
    self.orderitem_set.all().delete()   

所以问题是:我如何动态知道它是orderitem_set 还是shoppingcartitem_set

【问题讨论】:

    标签: django django-models interface dry


    【解决方案1】:

    您可以设置 ForeignKey 的 related_name 参数,因此,如果您想对您的设计进行最小的更改,您可以让 ShoppingCartItem 和 OrderItem 在其 ForeignKeys 上分别将相同的 related_name 设置为 ShoppingCart 和 Order(类似于“item_set "):

    order = models.ForeignKey(Order, related_name='item_set')
    

    cart = models.ForeignKey(ShoppingCart, related_name='item_set')
    

    【讨论】:

      【解决方案2】:

      首先,这里有两个 Django sn-ps,它们应该正是您正在寻找的:

      其次,您可能需要重新考虑您的设计并切换到 django.contrib content types framework,它有一个简单的 .model_class() 方法。 (上面发布的第一个 sn-p 也使用了内容类型框架)。

      第三,您可能不想在模型类中使用多重继承。它不应该是必需的,如果有一些模糊的副作用,我不会感到惊讶。只需让interface.ItemContainer 继承自models.Model,然后Order 仅继承自interface.ItemContainer

      【讨论】:

      • 您实际上可以像这样进行多重继承,并且它可以毫无问题地工作(据我所知),但我仍然可能从 Model 继承 ItemContainer (除非它的接口可以应用于非-模型对象)。
      猜你喜欢
      • 1970-01-01
      • 2021-07-10
      • 2014-08-17
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多