Модели Django, 2 внешних ключа, объектная логика - PullRequest
0 голосов
/ 28 января 2019

(С заглавными буквами объекты в процессе).

Это считается законным, моя цель состоит в том, чтобы иметь 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)

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

1 Ответ

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

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

Кроме того, установите для текстовых полей значениебыть чем-то вроде 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/

...