2009-08-15 71 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