2013-07-24 38 views
0

我被困在我的數據庫設計中的一個奇怪的位置,我將不勝感激一些評論。我們正在使用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

回答

0

使用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