Модель Django «многие ко многим» и таблицы «Мост» - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь понять, как правильно настроить мои модели, чтобы иметь отношение многие ко многим, я заметил, что существует опция ManyToManyField при создании моделей, но я не могу понять логику этогои как правильно заставить это работать.Я хотел бы поделиться своим кодом и объяснить по пути.

from django.db import models

class Major(models.Model):
    name = models.CharField(max_length=30, db_index=True)

class School(models.Model):
    name = models.Charfield(max_length=50, db_index=True)
    majors = models.ManyToManyField(Major)

class Professor(models.Model):
    ProfessorIDS = models.IntegerField()
    ProfessorName = models.CharField(max_length=100)
    ProfessorRating = models.DecimalField(decimal_places=2,max_digits=4)
    NumberOfRatings = models.CharField(max_length=50)
    school = models.ForeignKey(School , on_delete=models.CASCADE)
    major = models.ForeignKey(Major , on_delete=models.CASCADE)

Обратите внимание, что в школе TABLE (класс) есть много ко многим для майоров, что по сути то, что я хочу, цельиметь базу данных, позволяющую хранить несколько специальностей в отдельной школе.

Проведя некоторые исследования, я пришел к выводу, что в этом нет смысла, было бы лучше создать таблицу мостов, поэтому я решилчтобы создать мою модель следующим образом ...

from django.db import models

class Major(models.Model):
    name = models.CharField(max_length=30, db_index=True)

class School(models.Model):
    name = models.Charfield(max_length=50, db_index=True)


class School_Majors(models.Model):
    school = models.ForeignKey(School, on_delete=models.CASCADE)
    major = models.ForeignKey(Major, on_delete=models.CASCADE)

class Professor(models.Model):
    ProfessorIDS = models.IntegerField()
    ProfessorName = models.CharField(max_length=100)
    ProfessorRating = models.DecimalField(decimal_places=2,max_digits=4)
    NumberOfRatings = models.CharField(max_length=50)
    school = models.ForeignKey(School , on_delete=models.CASCADE)
    major = models.ForeignKey(Major , on_delete=models.CASCADE)

Разве это не было бы более правильным способом настройки базы данных для добавления и удаления нескольких основных предметов из школ и наоборот?

1 Ответ

0 голосов
/ 31 января 2019

Было бы лучше создать таблицу мостов

Вот что делает ManyToManyField.Ваши два фрагмента функционально идентичны.

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

from django.db import models

class Major(models.Model):
    name = models.CharField(max_length=30, db_index=True)


class School(models.Model):
    name = models.CharField(max_length=30, db_index=True)
    majors = models.ManyToManyField(Major, through='SchoolMajor')


class SchoolMajor(models.Model):
    major = models.ForeignKey(Major, on_delete=models.CASCADE)
    school = models.ForeignKey(School, on_delete=models.CASCADE)
    first_offered = models.DateField()

Адаптировано с здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...