Похоже, вы не очень разбираетесь в 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.