2. Как смоделировать отношения «один ко многим»?¶
В реляционных базах данных отношения «один ко многим» возникают, когда родительская запись в одной таблице может потенциально ссылаться на несколько дочерних записей в другой таблице. В отношениях один-ко-многим родительская запись не обязана иметь дочерние записи; поэтому отношения один-ко-многим допускают нулевые дочерние записи, одну дочернюю запись или несколько дочерних записей. Чтобы определить отношение «многие-к-одному», используйте ForeignKey.:
class Article(models.Model):
headline = models.CharField(max_length=100)
pub_date = models.DateField()
reporter = models.ForeignKey(User, on_delete=models.CASCADE, related_name='reporter')
def __str__(self):
return self.headline
class Meta:
ordering = ('headline',)
>>> u1 = User(username='johny1', first_name='Johny', last_name='Smith', email='johny@example.com')
>>> u1.save()
>>> u2 = User(username='alien', first_name='Alien', last_name='Mars', email='alien@example.com')
>>> u2.save()
>>> from datetime import date
>>> a1 = Article(headline="This is a test", pub_date=date(2018, 3, 6), reporter=u1)
>>> a1.save()
>>> a1.reporter.id
13
>>> a1.reporter
<User: johny1>
Если вы попытаетесь присвоить объект до его сохранения, вы столкнетесь с ошибкой ValueError:
>>> u3 = User(username='someuser', first_name='Some', last_name='User', email='some@example.com')
>>> Article.objects.create(headline="This is a test", pub_date=date(2018, 3, 7), reporter=u1)
Traceback (most recent call last):
...
ValueError: save() prohibited to prevent data loss due to unsaved related object 'reporter'.
>>> Article.objects.create(headline="This is a test", pub_date=date(2018, 3, 7), reporter=u1)
>>> Article.objects.filter(reporter=u1)
<QuerySet [<Article: This is a test>, <Article: This is a test>]>
Приведенный выше набор запросов показывает пользователя u1 с множеством Articles
. Следовательно, один ко многим.