【问题标题】:Django Related Models - magic behind the scenesDjango 相关模型 - 幕后魔术
【发布时间】:2018-10-28 19:47:10
【问题描述】:

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

谁能解释一下 Django 如何“匹配”相关模型的对象?

例如。我有两个模型,我正在向 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 “匹配”来自不同模型的两个对象。

更具体一点:

假设有两个 Reporter 对象 - r1 和 r2。
Article 类中有一个对象 - a1

django 是如何知道 a1 与 r1 相关而不与 r2 相关的?

感谢您的帮助!

【问题讨论】:

  • 不清楚你在问什么。正如你所说,有一个reporter_id 字段;指向 Reporter 的 id 字段。

标签: django database models


【解决方案1】:

看起来您并不真正精通 SQL,因为实际上没有涉及“魔法”,而且都是基本的关系模型设计。

您的上述模型转换为规范的一对多 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.idreporter_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 知识。

【讨论】:

  • 谢谢。 report = Reporter.objects.get(id=1) article = Article.objects.create(reporter=reporter) 这些是回答我问题的行。
猜你喜欢
  • 2016-12-15
  • 2012-06-04
  • 2020-10-22
  • 2022-01-13
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 2017-06-22
  • 2021-05-29
相关资源
最近更新 更多