DRF串行器字段,用于中间模式

时间:2019-02-01 12:44:38

标签: python django django-rest-framework

我正在制作一个用于控制学生在场的应用程序。我有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。我已经为StudentJustificationAbsence设置了端点(和序列化器),但是我不知道如何为Session模型制作序列化器。我希望它在有人发出以下POST(我只需要一个端点来创建Session)请求(我在视图中使用ViewSet)时起作用:

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

但是不会创建缺席。如何使这种嵌套关系起作用?

ps:我只能发出一个请求,这就是为什么我不想发出一个创建Session的请求,然后又不想创建一个Absence并同时需要它们的很多请求的原因。如果有一种方法可以在同一请求上创建所有这些对象(但不仅是同一JSON对象),我对这种解决方案还可以

1 个答案:

答案 0 :(得分:0)

如果我正确理解,您希望在相同的Season端点上创建相应的缺勤和季节。我认为JustificationStudent的两种模式服务相同,它们只是学生的实例,如果我没有记错的话,它们会保留学生的信息。因此,我认为实际上不需要保留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)

然后,有两种可能的方法来创建与Season Post端点相对应的缺勤模型实例。我们可以覆盖{{1}的方法post并有写我们的逻辑,甚至可以覆盖SeasonViewset方法来完成相同的。

我更可取的选择是覆盖SeasonSrealizer-create的发布方法。而这些是可以做到像以下 - 过写入DRF CreateMixins

SeasonViewset