【问题标题】:How can I get more intuitive feels about django relationships(like:Many-to-one,Many-to-many )我怎样才能更直观地了解 django 关系(例如:多对一、多对多)
【发布时间】:2009-12-26 00:37:01
【问题描述】:

我使用 xampp(它有 mysql)

我对这种 django 关系感到困惑, 谁能给我一个代码示例(或文本)让我直观感受一下。谢谢 (如:爱因斯坦描述相对论)

【问题讨论】:

  • +标签:xampp?也许还有 php、django?
  • 是的,它可以用于django
  • 一种“直觉的感觉”是没有用的。软件不像现实世界——它是人为的东西,由人们为解决特定问题而组成。你不能依赖直觉。你必须依靠事实和正式的推理。您必须了解详细的技术规则。

标签: python sql django


【解决方案1】:

我找遍了关于关系的简单解释,但没有找到任何东西,所以我将在这里尝试总结一下。

关系并不是严格意义上的 Django 事情。如果您真的想了解 Django 在做什么,请了解一般的数据库概念。


当您有多个信息表时,您需要以某种方式链接它们。如果您经营像 last.fm 这样的音乐网站,您将需要了解艺术家、流派、标签、歌曲、专辑等。所有这些数据都以某种方式相关。

例如,一位艺术家将有许多专辑(一对多),一种流派将适用于许多艺术家(一对多)。例如Metallica(一位艺术家)将有几张专辑,Black Album、St. Anger 等,但一张专辑可能不属于两位艺术家,例如Alicia Keys 和 Metallica 都录制了同一张专辑。为了实现这种关系,每个专辑记录都必须有一个 Artist_id 来指示它与哪个艺术家相关。

mysql> select * from albums where artist_id = 40;
+-----+------------------------------+------+---------------------+-----------+----------+------------+
| id  | name                         | year | created_at          | artist_id | genre_id | updated_at |
+-----+------------------------------+------+---------------------+-----------+----------+------------+
| 309 | Reise, Reise                 | 2004 | 2009-11-22 16:01:13 |        40 |        2 | NULL       | 
| 310 | Mutter                       | 2001 | 2009-11-22 16:12:28 |        40 |        2 | NULL       | 
| 311 | Sehnsucht                    | 1998 | 2009-11-22 16:20:22 |        40 |        2 | NULL       | 
| 312 | Live aus Berlin              | 1999 | 2009-11-22 16:29:11 |        40 |        2 | NULL       | 
| 313 | Rosenrot                     | 2005 | 2009-11-22 16:40:43 |        40 |        4 | NULL       | 
| 314 | The Very Best of Rammstein   |    0 | 2009-11-22 16:51:38 |        40 |        2 | NULL       | 
| 315 | Live aus Berlin (bonus disc) |    0 | 2009-11-22 17:05:24 |        40 |        2 | NULL       | 
+-----+------------------------------+------+---------------------+-----------+----------+------------+
7 rows in set (0.02 sec)

一个标签将描述几位艺术家(例如 Metal 描述 Metallica、Pantera 和 Sepultura),而一个艺术家将有多个标签(例如,人们可能将 Metallica 标记为 Metal、Rock 和 80s Metal。)数据之间的这种关系可能会产生三个表。一个艺术家表、一个标签表和一个连接表。例如,您的加入记录将如下所示(纯属虚构和假设情况)

| id | artist_id | tag_id |
| 1  | 34        | 357    |
| 2  | 98        | 234    |

artist_id 34 可能是 Metallica,tag_id 357 可能是 Metal。关键是,存在一个链接标签和艺术家的表。在这个例子中。

一般来说,关系是链接记录的一种方式。存在三种主要关系,一对一、多对多和多对一。

完全理解这一点的最好方法是学习Database Design

【讨论】:

    【解决方案2】:

    很难回答一个令人困惑的问题,但如果你想要代码,不妨试试http://www.djangosnippets.org/

    本教程还提供了很好的示例,说明模型如何在多对多等情况下工作,请参阅http://www.djangobook.com/en/1.0/chapter05/

    例如:

    from django.db import models
    
    class Publisher(models.Model):
        name = models.CharField(maxlength=30)
        address = models.CharField(maxlength=50)
        city = models.CharField(maxlength=60)
        state_province = models.CharField(maxlength=30)
        country = models.CharField(maxlength=50)
        website = models.URLField()
    
    class Author(models.Model):
        salutation = models.CharField(maxlength=10)
        first_name = models.CharField(maxlength=30)
        last_name = models.CharField(maxlength=40)
        email = models.EmailField()
        headshot = models.ImageField(upload_to='/tmp')
    
    class Book(models.Model):
        title = models.CharField(maxlength=100)
        authors = models.ManyToManyField(Author)
        publisher = models.ForeignKey(Publisher)
        publication_date = models.DateField()
    

    【讨论】:

    • 好的,这是一个教程。它假定您了解 Python 语言并从一开始就遵循它。或许您应该从第 1 章开始,并一直坚持下去。无论如何,我实际上会强烈推荐这个。
    猜你喜欢
    • 1970-01-01
    • 2011-03-18
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多