4

这是交易:

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

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

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

# ...

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

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

4

2 回答 2

3

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

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

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

于 2009-02-05T10:26:58.953 回答
2

您可以设置 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')
于 2009-02-05T17:31:21.123 回答