mysql - 如何解决 MySQL 和 Django Admin 外键约束

标签 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 种 Fabric 。
1 个款式共 7 个产品。

产品表将有七行,所有行的 styleid=1。

供应商会手动选择与该款式相关的产品,进入 related_1、related_2 等。

我理解 Django 和 MySQL 认为那里存在一些潜在的循环逻辑,因为每个产品都有一个 styleId 的 FK。因此,如果该 styleId 具有指向同一产品的外键,则可能会发生冲突。

但事实上,您显然不希望相关产品引用具有相同 styleId 的产品...这可以轻松地由应用程序而不是数据库处理。

我的解决方法允许用户手动将相关产品输入到表单中,但如果我能让 Django 拉出包含有效产品 ID 列表的选择下拉列表,那就太酷了。如果可能的话。

是吗?

附注我确实阅读了 related_field 上的 django 文档,但无法真正理解他们的意思。我尝试了一些东西,但他们没有提供太多示例代码。

第二个附注我根据请求对其进行了编辑,并添加了更详细的型号信息。我希望现在更清楚了...

最佳答案

您不应该想要创建您所描述的结构。这样做违反了许多关系数据原则。您可以通过查询产品表来找到 style#1 的产品。您希望通过这种方式构建事物来实现什么目标?

将有关哪些产品与哪些样式搭配的信息复制到样式表(或任何其他表)中是一个坏主意。每次添加新产品或更改产品样式时,它都要求您在多个位置更新数据。

当同一个表中有多个表示相同内容的列(列名称中的尾随数字除外)时,会出现不好的“关系味道”(称为“重复组”)。您将在表中放入 related_product 的多少列?这是否会限制同一款式的产品数量?如果与 related_product2 关联的产品被删除怎么办?您会采取任何措施将其他 related_productN 值之一移动到 related_product2 中,还是会在值列表中留下一个洞?

您将如何使用该格式的信息来查看产品是否涉及特定风格?您需要找到相关产品1 = 寻求产品OR 相关产品2 = 寻求产品OR ... 的样式。

与几乎所有问题一样,一个有值(value)的答案是“您真正想要实现什么目标?”我的意思是,你说你想做的事,实际上你并不想做,原因有很多。您能说出您需要做什么,并且通过您提到的结构会变得更容易吗? {whichhand} 展示了您可以在 Django 中执行的一些操作,而无需重复有关产品/样式关系的信息。

关于mysql - 如何解决 MySQL 和 Django Admin 外键约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1282219/

相关文章:

java - 如何让SQL连接语句通用

django - 删除后模型对象是否可用?

python - 如何 Pickle Django 模型

mysql - 如何使用 LOAD DATA LOCAL INFILE 加载金额?

mysql - Openshift,超出磁盘配额

javascript - 加载一组照片时,如何为每个 imageID 制作唯一的评论按钮功能?

mysql - 来自不同表的复杂浮点计算

django - 创建 dockerfile 以构建新图像

python - 如果已经有django项目,如何使用startproject(django-admin.py)?

Django 模板文件扩展首选项