【发布时间】:2018-04-05 12:16:06
【问题描述】:
过去的生活很简单。我们有一个产品表,每个产品都有一个产品代码。
不幸的是,我们是一家小型制造商,与几家大型分销商有关系,他们非常希望我们在向我们订购时使用他们的产品代码(有时甚至没有礼貌地描述人类类型的查找!)。所以它现在看起来像
Class ProductCode( models.Model)
item_desc = models.ForeignKey( ItemDesc, related_name=product_codes)
code = models.CharField( ...)
customer = ... # FK or Character, unique with code
primary = models.BooleanField( ... ) # wrong way?
...
Class ItemDesc( models.Model)
# code = models.CharField( ...) # what we used to do
primary_code = models.OneToOneField( ProductCode, ... ) # maybe?
...
如何确保每个 ItemDesc 始终只有一个且只有一个主要产品代码? (主要是我们在内部用来指代物品的物品,例如库存物品,以及直接销售给最终用户的物品)。
从概念上讲,我使用 item_desc 使主要唯一,但这并不能解决两个相关问题
它必须变成一个整数,(比如说)1 = 主要和 2..N 存在只是为了使非唯一并被视为假。
如何使 ItemDesc 始终具有主要 ProductCode?p>
或者,从 ItemDesc 返回到 ProductCode 的字段 primary = OneToOneField(...) 似乎描述了这种关系,但存在循环问题。我不得不
使用 null item_desc 创建产品代码,以便保存它们,所以
它们可以作为 1:1 与新的 ItemDesc 一起使用。那我就得回去了
在复制 1:1 关系的生产代码中填写 item_desc。
我有一种感觉,一定有更好的方法,但我想不出。或者这可以在 ItemDesc 模型中隐藏和干燥吗?
【问题讨论】:
-
这类似于this problem,您的船长是主要代码。这也是某人想做的事情here,答案是重新思考这种关系。我的第一个链接中的几个 cmets 提到在事务结束之前关闭外键检查,但我不确定在创建对象时这在实践中意味着什么。
-
在更基础的数据库级别上,this question 也很有趣,正如another question 的评论中提到的可延迟外键约束的存在一样。
标签: django database django-models