DRF在同一POST中创建具有多个子记录的记录

时间:2016-01-02 19:27:07

标签: django django-models django-rest-framework

我正在使用django-rest-framework 3.3.1,我正在努力在同一个POST中反序列化新记录和相关记录。

我的模特看起来像这样:

class Employee(models.Model):
    name = models.CharField(max_length=128)
    locn = models.CharField(max_length=128)

class Degree(models.Model):
    employee = models.ForeignKey(Employee, related_name='degrees')
    type = models.CharField(max_length=128)
    date = models.DateField()

我有一个简单的序列化程序:

class DegreeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Degree
        fields = ('id', 'employee', 'type', 'date',)

和一个简单的员工序列化程序:

class EmployeeSerializer(serializers.ModelSerializer):
    degrees = DegreeSerializer(many=True)

    class Meta:
        model = Employee
        fields = ('id', 'name', 'locn', 'degrees',)

我希望用户能够在同一个UI对话框中添加新员工及其学位(而不是先添加员工,然后再向现有员工添加学位)。我试图将新员工和新学位置于同一个POST中失败,DRF告诉我学位项目需要员工。是否可以在DRF本地执行此操作?

一个相关的问题是,当用户使用修改过的Degree项目在Employee上发出PUT时,如何确保这些度数项目实际上替换了DB中的所有现有项目?

感谢。

1 个答案:

答案 0 :(得分:1)

您需要处理嵌套对象创建。默认情况下,不支持,您需要从序列化程序重写create()update()方法。

这里有一个来自DRF docs

的例子