Как воссоздать эту точку зрения как модель Джанго - PullRequest
0 голосов
/ 18 октября 2019

У меня есть следующие модели в моем приложении

class Semester(models.Model):
    name = models.CharField(max_length=100, unique=True)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()


class Classroom(models.Model):
    semesters = models.ManyToManyField(to=Semester)
    name = models.CharField(max_length=100, unique=True)


class AvailabilityWindow(models.Model):
    semester = models.ForeignKey(to=Semester, on_delete=models.CASCADE)
    start_date_time = models.DateTimeField()
    end_date_time = models.DateTimeField()
    optional = models.BooleanField(default=False)
    label = models.CharField(max_length=100)

Я хочу добиться новой модели под названием ClassroomAvailabilityWindow, и я хочу, чтобы она была похожа на следующий вид

select
    *
from
        avail_classroom_semester cs
    join    
        avail_availabilitywindow aw
        on aw.semester_id = cs.semester_id

Так что это одна запись на класс, на окно доступности, но только когда этот класс и семестр объединены их множителем

Я знаю, что могу использовать представление как модель с managed=False но я хочу, чтобы пользователи могли обновлять эти записи. Есть ли способ достичь этого результата в django, возможно, используя опцию through с ManyToManyField? Это сбивает меня с толку из-за дополнительной сложности Classroom и Semester также , являющейся многими для многих.

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

class ClassroomAvailabilityWindow(models.Model):
    window = models.ForeignKey(to=AvailabilityWindow, on_delete=models.CASCADE)
    classroom = models.ForeignKey(to=Classroom, on_delete=models.CASCADE)
    pupil_group = models.CharField(max_length=100)
    subject = models.CharField(max_length=100)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...