【问题标题】:Should I be using a ForeignKey in this Django model?我应该在这个 Django 模型中使用 ForeignKey 吗?
【发布时间】:2014-07-30 11:40:00
【问题描述】:

我已经阅读了很多关于 Django 的内容,并终于开始为我概述的项目开发模型,但我无法理解 ForeignKeys,以及如何/何时使用它们。我已经阅读了一些关于数据库工作的信息,以便更好地理解外键,但是没有以前的数据库经验,我仍然有点困惑。

我提出了一个示例情况,类似于我正在从事的项目,并且想知道 ForeignKey 的两种用法是否正确,或者我应该使用 OneToOneField 或 ManyToManyField 代替它们。

在此示例情况下,我希望每个 Bridge 有多个构建器,并且每个工具有多个不同的用户(或熟练使用它们的构建器)。我不希望建造者同时在多座桥梁上工作(OneToOne??)。但是,我希望每个构建者都能够拥有他们熟练使用的多种工具(ManyToMany??)。

    class Builder(models.Model):
        first_name = models.CharField( max_length = 50 )

    class Bridge(models.Model):
        bridge_name = models.CharField( max_length = 50 )
        builders = models.ForeignKey(Builder)

    class Tool(models.Model):
        tool_name = models.CharField( max_length = 50 )
        users = models.ForeignKey( Builder )

据我了解,我可以在 views.py 文件中检索所有构建器的工具,尽管我还没有进行这部分开发,并希望在获得之前确保我有一个强大的模型远。

考虑到这个问题的普遍性和开放性,总的来说,我希望有人解释一下:

WHY each ForeignKey relationship in this example 
model is either used correctly or incorrectly.

【问题讨论】:

    标签: python django django-models foreign-keys


    【解决方案1】:

    这实际上不是 Django 问题,而是 ORM 问题,您需要了解 ORM 的工作原理和方式(除了使用的语言和框架)。 您的案例会产生不同的结果:

    1 桥可以有许多工人(一个(桥)

    1 桥可以有 1 个工人(一个(桥) 一个(工人),一对一字段)

    许多桥梁可以有许多工人(Many (Bridges) * -- * many (Workers), Many to Many field)

    如果您使用从工具到构建器的 ForeignKey,这意味着一个工人可以拥有许多工具,但每个工具对于工人来说都是独一无二的,如果您拥有多对多,那么任何工人都可以拥有任何工具。 如果您需要属于许多不同工作人员的工具,那么您需要多对多关系,如果工具需要一些特定限制(如技能),那么又需要具有特定限制的多对多关系(通过表可以包含有关关联,就像工人 1 每周五使用工具 1,这将是工人到工具的直通表,中间的表是工人使用特定工具的那一天)。

    【讨论】:

    • 如果你在bridge中指定了外键,那么你实际上是在告诉一个桥属于一个worker,一个worker可以有很多不同的桥,如果你在worker中指定了外键,那么它意味着一个工人有一座桥,但一座桥可以有许多工人。把它想象成一个下拉列表,如果你在工作模型中添加关系,那么你为特定工作选择桥(在下拉列表中),如果你反过来指定它,你选择桥的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2011-05-03
    • 2013-04-03
    • 2016-04-23
    相关资源
    最近更新 更多