django - 使用外键进行多表继承

django - 使用外键进行多表继承

问题描述:

我被困在我的数据库设计中的一个奇怪的位置,我将不胜感激一些评论。我们正在使用django-shop来建立电子商务平台。没有为产品定义的基类:django - 使用外键进行多表继承

from polymorphic.polymorphic_model import PolymorphicModel 

class BaseProduct(PolymorphicModel): 
    ... 
    class Meta: 
     abstract = True 

我们扩展了这个基类为我们自己Product对象:

class Product(BaseProduct): 
    # custom fields 

我们现在要创建另一个对象,表示要约此Product对象,是这样的:

class Offer(models.Model): 
    product = models.ForeignKey(Product) 
    # more 

我们希望添加这个Offer对象的车,并在订单中使用,就像普通Product类。然而,CartOrder类预计类型的对象Product

class Order(models.Model): 
    product = models.ForeignKey(Product) 

所以,因为它是,我们不能Offer对象添加到购物车,或者将它们保存订单。

我正在考虑将Offer作为Product的一个子类,但不是在典型的多表继承中使用OneToOne关系,而是以某种方式将其更改为常规的ForeignKey。我甚至不确定这是否有意义,更不用说可能了。

我们的数据库已经在生产环境中部署了许多Product对象,而这个offer类是我们想要添加的东西,而没有修改剩下的东西。

有关如何解决这个问题的任何想法?

+0

这可能取决于'Offer'的行为与购物车中'Product'的不同。它们是否足够相似以致'Offer'可以被认为是不同类型的'Product',并以某种方式将它们应用到当前的Product产品模型中?也许还有一些其他的继承可以做,让你不必改变产品,别人可能知道。 – trpt4him

使用Model Inheritance

class Offer(Product): 

    products = ManyToManyField(Product, related_name='offers') 

这将创建一个报价(这也是一种产品,因此可以被添加到购物车)也指出在一些相关的产品。

除了“将商品添加到购物车”之外,为什么不使用django-shop-discounts呢?

+0

我们用这种方法发现的问题是将提供和产品分离。我明白,在这种方法中,如果创建一个Offer对象,这也会创建一个Product model并将它们链接起来。但是,鉴于数据库中已经有Product对象,我们可以创建一个或多个Offer对象,并将其''product_ptr''重载为指向这些现有对象? – user1496984

+0

我说谎了一点,它不是外键,而是一对一的关系。所以不,你不能有多个产品指向一个产品。查看我的编辑。 – Thomas