我有一个样式表来识别每种产品类型的型号:
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都不允许我添加它们。
所以现在我只是将它们作为整数字段。我将下面的行添加到Style模型中:
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在那里看到一些潜在的循环逻辑,因为每个产品都有一个到StyleId的FK。因此,如果该styleId将外键返回到同一产品,则可能发生冲突。
但实际上,您显然不希望相关产品引用具有相同styleId的产品...这可以由应用程序而不是数据库轻松处理。
我的解决方法允许用户手动将相关产品输入到表单中,但如果我能让Django选择一个有效产品ID列表的选择下拉列表,那将非常酷。如果可能的话。
是吗?P.S。我确实读过了related_field上的django文档,但却无法真正理解他们所获得的内容。我尝试了一些方法,但它们没有提供样本代码的方式。
第二个P.S.我根据要求编辑了更详细的模型信息。我希望现在更清楚......
答案 0 :(得分:1)
您不应该想要创建您描述的结构。这样做违反了许多关系数据原则。您可以通过查询产品表找到样式#1的产品。你希望通过那种结构方式来实现什么目标?
将有关哪些产品的样式的信息复制到样式表(或任何其他表)中是一个坏主意。每次添加新产品或更改产品样式时,它都要求您在多个位置更新数据。
当同一个表中有多个列表示相同的内容时,除了列名称上的尾随数字之外,有一个错误的“关系气味”(称为“重复组”)。 related_product会在表格中放入多少列?这不会限制可能涉及相同风格的产品数量吗?如果与related_product2关联的产品被删除,该怎么办?您是否会将其他related_productN值之一移动到related_product2中,或者您只是在值列表中留下一个漏洞?
您将如何使用该格式的信息来查看产品是否涉及特定样式?您需要找到related_product1 = seek_product OR related_product2 = seek_product OR ....的那些样式。
与几乎所有问题一样,一个有价值的答案是“你真正想要实现的目标是什么?”我说你说你想做什么,你实际上并不想做,原因有很多。你能说出你需要做的是什么,你提到的结构会更容易吗? {whichhand}展示了你在Django中可以做的一些事情,而没有重复关于产品/风格关系的信息。
答案 1 :(得分: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()