【问题标题】:django difference between - one to one, many to one and many to manydjango 之间的区别 - 一对一、多对一和多对多
【发布时间】:2013-11-07 15:23:17
【问题描述】:

所以,这是我第一次学习计算机语言。我选择了python和django。现在,我了解了 python 和 django 的许多基本概念。我可以使用视图和所有其他内容创建新页面。但我仍然对这些关系感到困惑,即一对一、多对一和多对多。请有人请向我解释一下。我该如何使用它?我真的需要知道。

谢谢。

【问题讨论】:

    标签: django orm many-to-many one-to-one many-to-one


    【解决方案1】:

    尤其是 django,它让复杂的数据库设计变得轻而易举,我认为了解它们在 SQL 级别如何工作以更好地理解您正在做的任何事情非常重要。我认为一个例子是理解这一点的最佳方式。

    您应该了解的第一件事是每个 SQL 表都有一个称为“主键”的字段(通常会自动递增)。该字段是每行具有唯一值的列。

    假设您在 django 中创建了一个代表作者的模型,该模型具有三个字段 - first_name、last_name 和一个包含电子邮件的可选字段。 Django 还会自动添加主键字段并将其命名为 pk(您也可以决定定义自己的字段以用作主键,但通常不这样做)。因此,当使用命令 manage.py syncdb 时,它会创建一个如下所示的表:

    +----+------------+-----------+-----------------------+
    | pk | first_name | last_name |         email         |
    +----+------------+-----------+-----------------------+
    

    当您添加一个新值(例如“Stephen King”)时,它会将其添加到作者表中,如下所示:

    +----+------------+-----------+-----------------------+
    | pk | first_name | last_name |         email         |
    +----+------------+-----------+-----------------------+
    |  1 | Stephen    | King      | stephenking@gmail.com |
    +----+------------+-----------+-----------------------+
    

    让我们再添加一个:

    +----+------------+-----------+-----------------------+
    | pk | first_name | last_name |         email         |
    +----+------------+-----------+-----------------------+
    |  1 | Stephen    | King      | stephenking@gmail.com |
    |  2 | J.D.       | Salinger  |                       |
    +----+------------+-----------+-----------------------+
    

    这很简单。现在我们添加一个名为 Book 的新模型:

    +----+--------------+--------+--------+
    | pk |    title     | genre  | author |
    +----+--------------+--------+--------+
    |  1 | Pet Semetary | Horror |      1 |
    +----+--------------+--------+--------+
    

    现在看看我在那里做了什么?在作者字段中,我为 book 提供了 Stephen King 主键的值 - 请记住,它是唯一的,因此它只会取回 Stephen King。那是一个ForeignKey——它指向一个相关表上的一个pk,代表一个多对一的关系,即不同的书可以指向一个作者的同一个pk ,但反之则不然。这样每个作者可以拥有许多相关的书籍,但每本书只有一个作者。

    现在假设我们要添加斯蒂芬金的另一本书。这个叫护身符:

    +----+--------------+---------+--------+
    | pk |    title     |  genre  | author |
    +----+--------------+---------+--------+
    |  1 | Pet Semetary | Horror  |      1 |
    |  2 | The Talisman | Fantasy |      1 |
    +----+--------------+---------+--------+
    

    但是,哦,等等——最后一个实际上是与另一位名叫彼得·斯特劳布的作者合着的。那么我们该怎么办?我们首先需要将 Straub 添加到我们的作者表中:

    +----+------------+-----------+-----------------------+
    | pk | first_name | last_name |         email         |
    +----+------------+-----------+-----------------------+
    |  1 | Stephen    | King      | stephenking@gmail.com |
    |  2 | J.D.       | Salinger  |                       |
    |  3 | Peter      | Straub    |                       |
    +----+------------+-----------+-----------------------+
    

    但是现在我们如何告诉表格 The Talisman 与两个不同的行相关?简单 - 使用 第三个 表将两者联系起来。

    所以表一将是作者(如上所示)。第二张桌子是书。第三个表将被称为 authors_books,如下所示:

    +------------+--------------+
    | pk_of_book | pk_of_author |
    +------------+--------------+
    |          1 |            1 |
    |          2 |            1 |
    |          2 |            3 |
    +------------+--------------+
    

    看到了吗?它告诉您如何在表之间链接不同的 pk。这是一种多对多关系,因为不同的书籍可以与不同的作者相关联,反之亦然。而我描述的三表模式就是它的基本设计。

    OneToOne 关系类似于 ForeignKey,但使用 unique=True,因此您只能将一个对象链接到另一个对象,仅此而已。它通常用于在不更改原始模型的情况下扩展某个模型(例如,您想将自己的自定义字段添加到内置的 User 模型中)。

    希望这有助于解决问题。 Django 太棒了,您几乎不需要使用 SQL,但它仍然有助于了解一些后台发生的事情。网上有很多关于这些关系的解释,我只给你一个小的一般介绍,我强烈建议你谷歌一下,扩大你自己的理解。祝你好运!

    【讨论】:

    • 刚开始学习 Django 时,一位好朋友和我一起坐下来画图并解释了这一切。后来这对我有很大好处,当我看到你的问题时,我也必须这样做。我很高兴能帮上忙! =]
    【解决方案2】:

    关系是 MySQL 等关系数据库的一般概念。关于关系和 Django 的 ORM 的一切都在这里得到了很好的解释:https://docs.djangoproject.com/en/dev/topics/db/models/#relationships

    希望这会导致正确的方向。

    【讨论】:

    • 感谢您的链接!但我对one-to-onemany-to-many 仍有一些疑问。假设我想在不同的类中扩展更多的用户信息。我可以使用ForeignKey 代替One-to-One 字段吗?请您向我解释一下many-to-many 的关系,(我并没有完全理解所有这些浇头和会员资格)。
    猜你喜欢
    • 2011-03-08
    • 1970-01-01
    • 2014-11-03
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多