Django Похожие модели - магия за кулисами - PullRequest
0 голосов
/ 18 мая 2018

Я пытался найти ответ в документации Django, но не смог этого сделать.

Может кто-нибудь объяснить, как Django "сопоставляет" объекты связанных моделей?

например,У меня есть две модели, и я показываю Django, что они связаны:

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

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

Затем происходит волшебство, и Django сопоставляет две модели и добавляет поле _id.

MyВопрос в следующем: Как Джанго узнает, какие объекты этих двух моделей связаны между собой?Проверяет ли каждое поле этих объектов и определяет, есть ли совпадение?

EDIT : Как Django определяет, что конкретный объект Reporter связан с конкретным объектом Article?Я понимаю, что когда он находит совпадение, он добавляет поле _id, но я не понимаю, что именно он основывается на том, что django "сопоставляет" два объекта из разных моделей.

Чтобы быть более точным:

Допустим, есть два объекта Reporter - r1 и r2.
В классе Article есть один объект - a1

Как django узнает, что a1 относится к r1, а не к r2?

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 18 мая 2018

Похоже, вы не очень разбираетесь в 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_id, который ссылается на reporter.id.Здесь снова Джанго использует первичный ключ reporter.id в качестве ссылки на внешний ключ как (очень разумное) значение по умолчанию, поскольку вы явно не указали ему нацеливание на другое поле.

Теперь, когда вы создаете новый Article,Вы должны предоставить экземпляр Reporter, т. е. (при условии, что у вас есть репортер с идентификатором 1):

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

Затем ORM выдаст запрос SQL insert into yourappname_article (reporter_id) values (1), следовательно, связывает эту новую строку статьи сэта строка репортера, и теперь вы можете получить все статьи из репортера 1 с select * from yourappname_article where reporter_id=1 (это запрос, который Django ORM выдаст для Article.objects.filter(reporter_id=1))

Короче говоря, длинная история : Django ORM является лишь тонкой оболочкой вашей базы данных, и вы do должны знать, что такое реляционная база данных, как она работает и как правильно ее использовать (в том числе, как правильно проектировать вашу схему БД), еслиВы ожидаете сделать что-нибудь хорошее.Если вы даже не знаете, что такое внешний ключ, тогда непременно узнайте сначала о реляционной модели, правильном реляционном дизайне и основных вещах SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...