Django 相关模型 - 幕后魔法

Django Related Models - magic behind the scenes

我试图在 Django 文档中找到答案,但没有找到。

谁能解释一下 Django 如何 "match" 相关模型的对象?

例如。我有两个模型,我正在向 Django 展示它们是相关的:

class Reporter(models.Model):
    # ...
    pass

class Article(models.Model):
    reporter = models.ForeignKey(Reporter, related_name='report')

然后奇迹发生了,Django 匹配了两个模型,并添加了 _id 字段。

我的问题是: Django 如何知道这两个模型的哪些对象是相关的? 它是否检查这些对象的每个字段并查看是否匹配?

编辑: Django 如何确定特定的 Reporter 对象与特定的 Article 对象相关? 我知道当它找到匹配时它会添加 _id 字段,我不明白的是基于 django "matches" 来自不同模型的两个对象。

更具体地说:

假设有两个 Reporter 对象 - r1 和 r2。
文章 class 中有一个对象 - a1

django 怎么知道 a1 与 r1 相关而不是 r2?

感谢您的帮助!

看来你真的不SQL-savy,因为真的没有"magic"涉及而且都是基本的关系模型设计。

您的上述模型转换为规范的一对多 SQL 模式:

CREATE TABLE yourappname_reporter (
    id int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY(id)
    );

CREATE TABLE yourappname_article(  
   id int(11) NOT NULL AUTO_INCREMENT,
   reporter_id int(11) NOT NULL,
   PRIMARY KEY(id),
   CONSTRAINT `reporter_id_refs_id_XXXX` FOREIGN KEY (`reporter_id`) REFERENCES `yourappname_reporter` (`id`)
    );

如您所见,Django 为您的模型添加了一个 'id' 主键(因为您没有自己明确定义主键),并且 Article.reporter 字段转换为 reporter_id 引用 reporter.id 的外键。在这里,Django 再次使用 reporter.id 主键作为外键引用作为(非常明智的)默认值,因为您没有明确告诉他以另一个字段为目标。

现在,当您创建一个新的 Article 时,您必须提供一个 Reporter 实例,即(假设您有一个 ID 为 1 的记者):

reporter = Reporter.objects.get(id=1)
article = Article.objects.create(reporter=reporter)

然后 ORM 将发出 SQL 查询 insert into yourappname_article (reporter_id) values (1),因此将此新文章行与此记者行相关联,您现在可以使用 select * from yourappname_article where reporter_id=1 从记者 1 获取所有文章(这是 Django ORM 将为 Article.objects.filter(reporter_id=1) 发出的查询)

长话短说:Django ORM 只是对您的数据库的一个薄包装,您 必须知道什么关系数据库是什么,它是如何工作的以及如何正确使用它(包括如何正确设计你的数据库模式)如果你希望做任何好事。如果您甚至不知道外键是什么,那么一定要先了解关系模型、正确的关系设计和基本 SQL 东西。