@hermina.hauck
В Django зависимости моделей задаются с помощью ForeignKey, OneToOneField, ManyToManyField или GenericForeignKey.
- ForeignKey используется для установления отношения "один-ко-многим" (one-to-many). Например, если у нас есть модель "Автор" и модель "Книга", каждая книга принадлежит только одному автору, но автор может иметь множество книг. Зависимость определяется следующим образом:
1
2
3
4
5
6
7
8
|
class Author(models.Model):
name = models.CharField(max_length=100)
...
class Book(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
...
|
- OneToOneField используется для установления отношения "один-к-одному" (one-to-one). Например, если у нас есть модель "Пользователь" и модель "Профиль", каждый пользователь имеет только один профиль, а профиль также принадлежит только одному пользователю. Зависимость определяется следующим образом:
1
2
3
4
5
6
7
8
|
class User(models.Model):
username = models.CharField(max_length=100)
...
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField()
...
|
- ManyToManyField используется для установления отношения "многие-ко-многим" (many-to-many). Например, если у нас есть модель "Студент" и модель "Курс", каждый студент может быть записан на несколько курсов, и каждый курс может иметь несколько студентов. Зависимость определяется следующим образом:
1
2
3
4
5
6
7
8
|
class Student(models.Model):
name = models.CharField(max_length=100)
courses = models.ManyToManyField(Course)
...
class Course(models.Model):
name = models.CharField(max_length=100)
...
|
- GenericForeignKey используется для установления полиморфного отношения между моделями. Например, если у нас есть модель "Комментарий" и модель "Статья" и модель "Фотография", комментарии могут быть оставлены как для статей, так и для фотографий. Зависимость определяется следующим образом:
1
2
3
4
5
6
|
class Comment(models.Model):
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
text = models.TextField()
...
|
Здесь поле content_type задает тип связанного объекта, а object_id - его идентификатор. content_object - виртуальное поле, ссылающееся на связанный объект.