我正在制作一个用于控制学生在场的应用程序。我有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
)请求(我在视图中使用ViewSet
)时起作用:
{
"date": "2019-02-01T10:08:52-02:00"
"present": [
2
],
"absences": [
{
"student": 1,
"justification": 1
}
]
}
但是不会创建缺席。如何使这种嵌套关系起作用?
ps:我只能发出一个请求,这就是为什么我不想发出一个创建Session
的请求,然后又不想创建一个Absence
并同时需要它们的很多请求的原因。如果有一种方法可以在同一请求上创建所有这些对象(但不仅是同一JSON对象),我对这种解决方案还可以
答案 0 :(得分:0)
如果我正确理解,您希望在相同的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)
然后,有两种可能的方法来创建与Season
Post端点相对应的缺勤模型实例。我们可以覆盖{{1}的方法post
并有写我们的逻辑,甚至可以覆盖SeasonViewset
方法来完成相同的。
我更可取的选择是覆盖SeasonSrealizer-create
的发布方法。而这些是可以做到像以下 - 过写入DRF CreateMixins
SeasonViewset