【问题标题】:Django table with specific relation to two or more other tables与两个或多个其他表具有特定关系的 Django 表
【发布时间】:2016-07-21 14:43:24
【问题描述】:

如何建立这样的关系:

想象一下餐厅。他们的数据表中有一个用于食谱,一个用于配料。还有一个,包含晚餐、午餐、早餐、甜点、汤等食物类别。我们将其命名为 cat_food。

厨师想要使用 cat_food 对食谱和配料进行排序。例如,在所有其他列中,从 recipes 到 cat_food 存在“ManyToOne”关系。所以一个菜谱有一个类别,一个类别有几个菜谱。

但厨师也想以这种方式对食材进行分类。在这里,我们将有一个“多对多”的关系,而我们可以在甜点食谱中使用一种成分,就像在晚餐或汤食谱中一样。

一种解决方案是为自己的食谱和配料创建一个 cat_food 表。但是如何创建 cat_food 表,它存储食谱或配料?(取决于给定的内容)

我的想法是使用中间模型并使用字段选项“blank=True”和“null=True”设置“foreignKeys”。但我对此并不满意。 从长远来看,它是否可能会导致一些数据库问题?有没有更优雅的方式来处理这种情况?

【问题讨论】:

    标签: django database django-models django-database django-datatable


    【解决方案1】:

    恕我直言,您所说的标准关系,外键和多对多似乎是最好的;因为您可以使用合适的字段管理每个项目(配方、成分、类别),并且 django 非常支持它们的链接参考,因此考虑它们的关系进行查询变得非常容易。

    此外,如果您想要一个带有额外字段的自定义 M2M 表,您可以使用through 属性构建自己。

    【讨论】:

    • 所以你会说这是这样做的好方法。使用食谱和配料创建一个 cat_food,同时它们都有字段选项“blank=True”和“null=True”。所以它可以是一个食谱项目或一个成分。是的,我正在考虑通过 through 使用直接表。我想这在这种情况下很有帮助
    【解决方案2】:

    我不确定这是否是您要查找的内容,但也许您可以为您的两个不同表的每个类别创建布尔值?

    例如,如果您的厨师有“草莓”项目,而您的不同类别是晚餐、午餐、早餐、甜点和汤。然后您可以检查该食物可能进入的类别。例如:早餐 == 真,甜点 == 真,汤 == 假。以及其他类别。

    如果您同时使用这两种方法,那么您可以在模板中设置配方和成分,并使用按钮或下拉菜单来过滤结果。

    【讨论】:

    • 我喜欢这个主意,但是……我想让它尽可能地少冗余。我的意思是,如果 cat_food 有一个新项目,那么我只想把它放在那里,作为食谱或配料中的新选项。好的,我的例子有点边缘,因为很难创建一个新的食物类别......假设新的食物类别是 astroout-dinner......现在当我添加一个新的食谱或配料时,我想要一个包含所有可能的 cat_food 项目的下拉菜单。而且我想使用尽可能少的列。
    • 有道理,也许您可​​以创建第三种内容类型?我认为您可以导入单独创建的内容类型。多对多关系也可能有效,我以前使用过它们,它们相当有用。试试这个链接看看它是否会工作-docs.djangoproject.com/en/1.9/topics/db/examples/many_to_many
    • 我的问题是两个表与同一个表通信,即 cat_food。通过这个,我有一个关于食谱和 cat_food 成分的专栏。当一个被给予时,另一个是空的。我猜我可以通过“blank=True”和“null=True”来处理这个问题。但我不太确定以后的故障排除。
    • 您还可以自动将配方中的成分与它们所在的配方相同的类别?
    • 很遗憾没有,因为所有的成分都应该默认给出。我需要先填写它们,然后人们才能选择它们。好吧,我看到的烹饪示例非常糟糕……所以就是这样。我是为数据库提供所有成分和制作食谱的人的厨师。 cat_food 用于稍后阶段的查询,当数据库增长时,我正在向成分添加类别(cat_food),当它们被用于新类别时(就像我说的那样,这实际上是烹饪和食物的一个坏例子)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 2019-06-18
    • 2016-11-10
    • 2011-07-25
    • 2018-09-15
    相关资源
    最近更新 更多