Реализация внешнего ключа модели Django
Первичный ключ: в Django, если вы явно не укажете первичный ключ модели, Django автоматически создаст для нее поле первичного ключа с именем «id», которое представляет собой целочисленный тип с автоинкрементом. Поэтому, если в модели Author не указан явный первичный ключ, его первичным ключом является автоматически сгенерированное поле «id».
Внешний ключ (ForeignKey): в Django таблицы могут быть связаны через внешние ключи (ForeignKey). Внешний ключ — это способ связать поле одной таблицы с полем другой таблицы. В Django внешний ключ обычно определяется в одной модели, который указывает на первичный ключ другой модели, тем самым устанавливая связь между двумя моделями.
Связь «один к одному» (OneToOneField): связь «один к одному» означает, что один экземпляр модели может соответствовать только другому экземпляру модели. В Django вы можете использовать OneToOneField для определения отношений один к одному.
Связь «многие ко многим» (ManyToManyField). Связь «многие ко многим» означает, что один экземпляр модели может соответствовать нескольким другим экземплярам модели, а один другой экземпляр модели также может соответствовать нескольким экземплярам модели. В Django вы можете определить отношения «многие ко многим», используя ManyToManyField. Связь «многие ко многим» обычно необходимо реализовать через промежуточную таблицу, в которой записывается соответствие между двумя экземплярами модели.
Составной первичный ключ (CompositeKey). Составной первичный ключ относится к совместному использованию нескольких полей в качестве первичного ключа для уникальной идентификации экземпляра модели. В Django совместные первичные ключи не поддерживаются по умолчанию, но вы можете использовать сторонние библиотеки для реализации функциональности совмещенных первичных ключей.
- Внешний ключ (ForeignKey)
Например, если у вас есть модель «Автор» и модель «Книга», вы можете определить внешний ключ в модели «Книга», который указывает на первичный ключ модели «Автор». Таким образом, каждая книга может быть связана с автором.
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
В этом примере поле author в модели Book является внешним ключом, указывающим на первичный ключ модели Author. Параметр on_delete=models.CASCADE указывает, что при удалении автора будут удалены все книги, связанные с ним (т. е. каскадное удаление). Таким образом, вы можете получить доступ к данным связанной модели Author через поле author модели Book. Например, если у вас есть экземпляр книги, вы можете получить доступ к связанному с ним экземпляру автора как book.author.
- Связь «один к одному» (OneToOneField)
Предположим, у нас есть две модели: Человек и Паспорт.У каждого человека есть только один паспорт, и каждый паспорт принадлежит только одному человеку.Это отношение один к одному. В Django
вы можете использовать OneToOneField для определения такого рода отношений, например:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=100)
class Passport(models.Model):
number = models.CharField(max_length=20)
person = models.OneToOneField(Person, on_delete=models.CASCADE)
В этом примере поле person в модели Passport — это OneToOneField, указывающее на
модель Person. Таким образом, каждый паспорт может быть связан с человеком, и у каждого человека есть только один паспорт.
- Связь «многие ко многим» (ManyToManyField)
Предположим, у нас есть две модели: «Студент» и «Курс». Учащийся может пройти несколько курсов, и курс также может пройти несколько студентов. Это отношение «многие ко многим». В Django вы можете определить это отношение с помощью ManyToManyField, например:
from django.db import models
class Student(models.Model):
name = models.CharField(max_length=100)
courses = models.ManyToManyField(Course)
class Course(models.Model):
name = models.CharField(max_length=100)
В этом примере поле курсов в модели Student — это поле ManyToManyField, указывающее на модель Course. Таким образом, каждый студент может пройти несколько курсов, и каждый курс может пройти несколько студентов.
- Комбинированный первичный ключ (CompositeKey)
Предположим, у нас есть модель: Заказ, который имеет два поля: order_id и customer_id, эти два поля вместе действуют как первичный ключ для уникальной идентификации заказа. В Django составные первичные ключи не поддерживаются по умолчанию, но вы можете использовать сторонние библиотеки для реализации функциональности составных первичных ключей, например django-composite-foreignkey.
from django.db import models
from compositefk.fields import CompositeForeignKey
class Customer(models.Model):
name = models.CharField(max_length=100)
class Order(models.Model):
order_id = models.IntegerField()
customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
customer_id = models.IntegerField()
class Meta:
primary_key = CompositeKey('order_id', 'customer_id')
В этом примере первичный ключ в модели Order представляет собой комбинацию двух полей «order_id» и «customer_id». Мы используем CompositeForeignKey в библиотеке django-composite-foreignkey для определения составного внешнего ключа, поля клиента и Подключение модели клиента. Таким образом, каждый заказ может быть однозначно идентифицирован двумя полями «order_id» и «customer_id».
- __str__ функция
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
def __str__(self):
return self.title
__str__ — это специальный метод в Python, используемый для определения строкового представления объекта. В моделях Django метод __str__ обычно используется для определения удобочитаемого представления модели для использования при отображении объектов модели в интерфейсе администратора и в других местах.
В этом примере модель Book содержит поле внешнего ключа, указывающее на модель Author. Это поле внешнего ключа связывает модель книги с моделью автора и указывает параметр n_delete=models.CASCADE, чтобы гарантировать, что при удалении связанной записи автора будет также удалена связанная запись книги.
Например, если мы просматриваем объект автора с именем «Джон Доу» в административном интерфейсе Django, он будет отображаться как «Джон Доу» вместо представления объекта по умолчанию, такого как <Автор: объект автора (1)>.
- перенос данных
python manage.py makemigrations
python manage.py migrate