Модели Django, 2 внешних ключа, объектная логика

(Заглавные объекты в процессе).

Считается ли это законным, моя цель состоит в том, чтобы иметь 3 отдельных объекта (причина этого заключается в том, чтобы позволить мне назначить конкретную школу + специальность конкретным профессорам). Когда пользователь должен выбрать ШКОЛУ, я хочу, чтобы мой веб-сайт вытягивал ОСНОВНЫЕ ОБРАЗОВАНИЯ, которые конкретно соответствуют этой ШКОЛЕ, и когда они выбирают ОСНОВНЫЕ, я хочу, чтобы отображались конкретные ПРОФЕССОРЫ.

Логическая связь между нижеприведенными объектами (бизнес-правила)

ШКОЛА должна быть отношением «многие ко многим» с ОСНОВНЫМ:

  • В одной ШКОЛЕ может быть МНОГО специальностей
  • У одной специальности может быть МНОЖЕСТВО ШКОЛ

Профессор

  • ПРОФЕССОР может работать в ОДНОЙ ШКОЛЕ и преподавать ОДНУ ОСНОВНУЮ
  • майор может преподаваться МНОГИМИ ПРОФЕССОРАМИ во МНОГИХ ШКОЛАХ

Итак, моя трудность заключается в написании логики моделей, чтобы гарантировать выполнение всех условий, информация, установленная перед правилами, — это опыт, который я хочу, чтобы мои пользователи имели, когда дело доходит до информации, извлеченной из базы данных на веб-сайт, и логика ниже Это.

from django.db import models

    class Professor(models.Model):
        School = models.ForeignKey(School , on_delete=models.CASCADE)
        Major = models.ForeignKey(Major , on_delete=models.CASCADE)

    class Major(models.Model):
        Major = models.CharField(max_length=30)
        School = models.ForeignKey(School , on_delete=models.CASCADE)

    class School(models.Model):
        School = models.Charfield(max_length=50)

Кроме того, если у вас есть какие-либо рекомендации по тому, как сделать эту логику более понятной, я был бы очень признателен!


person david yeritsyan    schedule 28.01.2019    source источник


Ответы (1)


Попробуйте использовать поля «многие ко многим» для связи между школами и специальностями. Я бы добавил это в школу, так как лично я думаю об этом так: «В школах много специальностей» чаще, чем «Основы преподаются во многих школах», но оба были бы в порядке.

Кроме того, установите для текстовых полей что-то вроде name, так как именно это представляет собой текстовое поле: не школа/специальность, а скорее название школы/специальности. В остальном ваша логика хороша

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):
    school = models.ForeignKey(School , on_delete=models.CASCADE)
    major = models.ForeignKey(Major , on_delete=models.CASCADE)

Получив это, вы можете брать основные объекты и добавлять их в школы.

major = Major.objects.get(name='Physics')
school = School.objects.get(name='Harvard')
school.majors.add(major)  

...или возьмите школы и добавьте их к специальностям с помощью обратного поиска (атрибут "_set"):

school = School.objects.get(name='Harvard')
major = Major.objects.get(name='Physics')
major.school_set.add(school)

Профессора будут созданы без отношений ManyToMany

school = School.objects.get(name='Harvard')
major = Major.objects.get(name='Physics')
Professor.objects.create(school=school, major=major)

Ссылка на документацию по ManyToManyField: https://docs.djangoproject.com/en/2.1/topics/db/examples/many_to_many/

person Robert Townley    schedule 28.01.2019
comment
спасибо вам большое за понятное объяснение! У меня был вопрос относительно последнего фрагмента кода, поэтому при добавлении школ и специальностей, школа = школа и майор = майор, означает ли это, что внутри базы данных я буквально увижу название специальности и школы , или они будут уникальными идентификаторами специальности и школы, которые будут ссылаться на основные и школьные объекты. - person david yeritsyan; 28.01.2019
comment
Он будет храниться в базе данных как уникальный идентификатор школьного объекта. Например, если вы использовали ORM для поиска professor.school, вы получите объект школы django, к которому принадлежит этот профессор. Вы также можете сделать professor.school_id (поле, которое Django создает автоматически), чтобы получить числовой идентификатор школы. Наконец, вы также можете получить доступ к professor.school.name, чтобы получить название школы (то же самое касается professor.major.name). - person Robert Townley; 28.01.2019
comment
Хорошо, просто чтобы убедиться, что я на правильной странице, глядя на Professor.objects.create(school=school, major=major), я могу думать об этом как об уникальном идентификаторе, который представляет майор, и уникальный идентификатор, который представляет школа, присваивается школе классов профессора и основным внешним ключам в базе данных. - person david yeritsyan; 28.01.2019
comment
Ага, точно. По умолчанию поле в базе данных представляет собой имя поля плюс _id. Например, вы можете зайти в оболочку SQL и запустить SELECT * FROM myapp_professor WHERE school_id=1; и ожидать результата, если в школу назначены профессора с идентификатором 1. - person Robert Townley; 28.01.2019