Поле сериализатора DRF для промежуточного режима - PullRequest
0 голосов
/ 01 февраля 2019

Я делаю приложение для контроля присутствия студентов.У меня есть 4 модели:

class Student(models.Model):
    name = models.CharField(max_length=70)

class Justification(models.Model):
    name = models.CharField(max_length=70)

class Session(models.Model):
    date = models.DateTimeField()
    present = models.ManyToManyField(Student)
    absences = models.ManyToManyField(Student, related_name='absences_set', through='Absence')

class Absence(models.Model):
    session = models.ForeignKey(Session, on_delete=models.CASCADE)
    atleta = models.ForeignKey(Student, on_delete=models.CASCADE)
    justification = models.ForeignKey(Justification, on_delete=models.CASCADE)

Модели имеют больше полей и разных имен (я перевел названия на английский), но это в основном так.

Я использую среду DRF для созданияAPI.Я настроил конечные точки (и сериализаторы) для Student, Justification и Absence, но не могу понять, как создать сериализатор для модели Session.Я хочу, чтобы это работало, когда кто-то делает следующий POST (мне нужна только конечная точка для создания Session s) запроса (я использую ViewSet для представления):

{
    "date": "2019-02-01T10:08:52-02:00"
    "present": [
        2
    ],
    "absences": [
        {
          "student": 1,
          "justification": 1
        }
    ]
}

НоОтсутствия не созданы.Как я могу заставить эти вложенные отношения работать?

ps: я могу сделать только один запрос, поэтому я не хочу делать один запрос для создания Session, а затем много запросов для создания Absence s.и нужно все это вместе.Если есть способ создать их все по одному и тому же запросу (но не только по одному и тому же объекту JSON), я согласен с этим решением

1 Ответ

0 голосов
/ 01 февраля 2019

Если я правильно понимаю, вы хотите создать соответствующие отсутствия и сезон в одной и той же Season конечной точке.Я думаю, что Justification и Student обе модели служат одинаково, они являются просто примером ученика и хранят информацию ученика, если я не ошибаюсь.Так что я не думаю, что на самом деле нужно сохранять модель Justfication.Соответствующие absences (студенты) в Season Model должны попросить Justification.Поэтому я советую сохранить структуру модели такой, как эта

class Student(models.Model):
    name = models.CharField(max_length=70)

class Session(models.Model):
    date = models.DateTimeField()
    present = models.ManyToManyField(Student)
    absences = models.ManyToManyField(Student, related_name='absences_set', through='Absence')

class Absence(models.Model):
    session = models.OneToOneField(Session, on_delete=models.CASCADE) # You can also keep Foreign-key
    atleta = models.ForeignKey(Student, on_delete=models.CASCADE)

И есть два возможных способа создания экземпляра модели Absence, соответствующего Season Постконечная точка.Мы можем перезаписать post метод SeasonViewset и записать туда нашу логику, или даже можем перезаписать SeasonSrealizer-create метод, чтобы сделать то же самое.

Мой предпочтительный вариант - переписать почтовый метод SeasonViewset.И это можно сделать следующим образом: переписать DRF CreateMixins

class SeasonViewSet(viewsets.ModelViewSet): 
     # your declare serializers and others thing

     def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        season_instance = self.perform_create(serializer)
        # creating Absence's instance and you need to add other fields as necessary
        Absence.objects.create(season=season_instance)
        headers = self.get_success_headers(serializer.data)

        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...