Ассоциация между таблицами модели Django и таблицами (внешний ключ, один к одному, многие ко многим, совместный первичный ключ)

Реализация внешнего ключа модели Django

Первичный ключ: в Django, если вы явно не укажете первичный ключ модели, Django автоматически создаст для нее поле первичного ключа с именем «id», которое представляет собой целочисленный тип с автоинкрементом. Поэтому, если в модели Author не указан явный первичный ключ, его первичным ключом является автоматически сгенерированное поле «id».

Внешний ключ (ForeignKey): в Django таблицы могут быть связаны через внешние ключи (ForeignKey). Внешний ключ — это способ связать поле одной таблицы с полем другой таблицы. В Django внешний ключ обычно определяется в одной модели, который указывает на первичный ключ другой модели, тем самым устанавливая связь между двумя моделями.

Связь «один к одному» (OneToOneField): связь «один к одному» означает, что один экземпляр модели может соответствовать только другому экземпляру модели. В Django вы можете использовать OneToOneField для определения отношений один к одному.

Связь «многие ко многим» (ManyToManyField). Связь «многие ко многим» означает, что один экземпляр модели может соответствовать нескольким другим экземплярам модели, а один другой экземпляр модели также может соответствовать нескольким экземплярам модели. В Django вы можете определить отношения «многие ко многим», используя ManyToManyField. Связь «многие ко многим» обычно необходимо реализовать через промежуточную таблицу, в которой записывается соответствие между двумя экземплярами модели.

Составной первичный ключ (CompositeKey). Составной первичный ключ относится к совместному использованию нескольких полей в качестве первичного ключа для уникальной идентификации экземпляра модели. В Django совместные первичные ключи не поддерживаются по умолчанию, но вы можете использовать сторонние библиотеки для реализации функциональности совмещенных первичных ключей.

  1. Внешний ключ (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.

  1. Связь «один к одному» (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. Таким образом, каждый паспорт может быть связан с человеком, и у каждого человека есть только один паспорт.

  1. Связь «многие ко многим» (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. Таким образом, каждый студент может пройти несколько курсов, и каждый курс может пройти несколько студентов.

  1. Комбинированный первичный ключ (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».

  1. __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)>.

  1. перенос данных
python manage.py makemigrations
python manage.py migrate

Guess you like

Origin blog.csdn.net/qq_38393271/article/details/131508578
Recommended