我一直在阅读很多关于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.
答案 0 :(得分:0)
它实际上不是一个Django问题,而是一个ORM问题,你需要了解ORM的工作原理和方式(除了使用的语言和框架)。 您的案例会产生不同的结果:
1个桥可以有很多工人(一个(桥)< - *很多(工人),ForeignKey)
1个桥可以有1个工人(一个(桥)< - >一个(工人),一个到一个字段)
许多桥梁可以拥有许多工人(许多(桥梁)* - *许多(工人),多对多的工人)
如果您使用从工具到构建器的ForeignKey,则意味着工作人员可以拥有许多工具,但每个工具对于工作人员来说都是唯一的,如果您有多个工具,那么任何工作人员都可以拥有任何工具。 如果您需要工具来属于许多不同的工作者,那么您需要多对多的关系,如果工具需要一些特定的限制(如技能),那么再次具有多个与特定限制的关系(通过表格可以保存关于这个协会就像工人1每个星期五使用工具1一样,这是一个工人工作台,工具用中间工作台保存工人使用特定工具的那一天。