2009-08-15 68 views
0

我有一個樣式表來確定每個產品類型型號:你怎麼解決的MySQL和Django管理外鍵約束

class Style(models.Model): 
    style = models.AutoField(primary_key=True) 
    name = models.CharField('Title', max_length=150) 
etc.. 

我需要標識的所有變型產品產品表上述型號:

class Product(models.Model): 
    product = models.AutoField(primary_key=True) 
    style = models.ForeignKey(Style, db_column='style') 
    color = models.CharField(max_length=250, blank=True) 
    price = models.IntegerField(max_length=10, blank=True) 
etc.. 

然而,客戶希望能夠推薦其他符合上述風格的產品。所以我想添加一些「相關產品」列作爲外鍵。但是MySQL和Django都不允許我添加它們。

所以現在我只是做了他們整場。我在樣式模型中添加了以下幾行:

related_1 = models.IntegerField('Related Product1',blank=True,max_length=10, default=0) 
    related_2 etc.. 

例如,polo衫的styleId = 1。
它有4種不同的顏色和3種面料。
共有7款產品適用於1款式。

該產品表將有七行所有與styleid = 1。

賣方將手動選擇都涉及到風格的產品,其中進入related_1,related_2等

我明白Django和MySQL的意見一些潛在的循環邏輯那裏,因爲每個產品都有一個FK到styleId 。所以如果styleId有一個外鍵返回到同一產品,就可能發生衝突。

但事實上,你顯然不希望讓相關產品參考產品瓦特/同樣的styleId ...這可以很容易地通過應用程序而不是數據庫來處理。

我的解決方法允許用戶手動輸入相關產品到形式,但它是真的很酷,如果我能得到的Django拉一個選擇下拉與有效的產品ID的列表。如果可能的話。

是嗎?

P.S.我確實閱讀了related_field上的django文檔,但無法真正跟蹤他們所得到的結果。我嘗試了一些東西,但他們沒有提供太多的示例代碼。

2nd P.S.我根據請求編輯它,並提供更詳細的模型信息。我希望這是更清楚現在...

回答

0

由於每個表都應該被描述成一個Django模型,這將是有益的,如果你直接貼上面的模型定義,而不是表的說明。我覺得這是你真正的問題所在。

在Django中,你通常會先定義一個樣式,然後定義產品他們每個人一個風格關聯起來。事情是這樣的:

style1 = Style.objects.create(styleId=1, name='jacket') 

Product.objects.create(productId=1, Name='bob', 
    Color='blue', Fabric='denim', styleId=style1) 
Product.objects.create(productId=2, Name='sam', 
    Color='red', Fabric='denim', styleId=style1) 

然後,您可以訪問的風格給定的產品是這樣的:

product1 = Product.objects.get(pk=1) 
product1.styleId.name 

或全部定樣式的產品是這樣的:

style1 = Style.objects.get(pk=1) 
style1.styleid_set.all() 
+0

謝謝。我是Django新手只使用管理,所以我不太熟悉這種語法。讓我拿出我得到的並編輯原始帖子。 – joedevon 2009-08-15 23:49:38

1

你不應該想要創建你描述的結構。這樣做違反了一些關係數據原則。您可以通過查詢產品表來查找產品樣式#1。通過這種方式來構建事物,你希望達到什麼目的?

將樣式表(或任何其他表格)中哪些產品的樣式信息複製到樣式表(或任何其他表格)中是一個壞主意。它要求您每次添加新產品時都要在多個位置更新數據,或更改產品的樣式。

如果在同一個表中有多個表示相同內容的列(除了列名稱上的尾部數字),則存在不良「關係氣味」(稱爲「重複組」)。您將在表中放入多少個related_product列?這不會限制可能涉及相同風格的產品數量嗎?如果與related_product2關聯的產品被刪除,該怎麼辦?你會做任何事情將其他related_productN值之一移到related_product2,或者你會在值列表中留下一個洞嗎?

您將如何使用該格式的信息來查看產品是否與特定風格有關?您需要在related_product1 = wanted_product OR related_product2 = wanted_product或....中找到這些樣式。

與幾乎所有問題一樣,一個有價值的答案是「您真正想要完成什麼?」我說的是,你說你想要做什麼,你實際上並不想這麼做,原因很多。你能否說出你所需要做的事情會讓你提到的結構變得更容易? {whichhand}展示了你可以在Django中做的一些事情,而不需要複製關於產品/樣式關係的信息。

+0

我正在嘗試做很多電子商務商店。在產品詳細信息頁面上,允許供應商列出2-3個相關產品。這是一個體面的例子:http://bit.ly/2Q85Ez他們有毛衣的型號。多種顏色。並且可以通過3種相關產品向底部「您也可能會喜歡」。我沒有複製樣式表中的信息。我只是指向相關產品。我的代碼已經處理表中的漏洞。沒有縮略圖,沒有顯示。但如果你有更好的表格結構,我很樂意學習新的東西。 TX。 – joedevon 2009-08-16 00:03:58

+0

有趣的是你的工具如何改變你的範例。如果我不是使用Django的新手,並且意識到我甚至不會想到related_1,2,3,我開始思考如何構造這個結構。我會做一個交叉表。但我只是不知道如何讓Django從交叉點下拉選擇產品。 – joedevon 2009-08-16 08:29:39