Django POST Serializers外键嵌套数据

时间:2016-07-22 12:38:12

标签: django post django-rest-framework

您好我是django serializers.Facing与POST序列化程序的小问题的新手。

models.py

class emp_shifts(models.Model):
    emp_id                  =   models.ForeignKey('emp_details')
    emp_shift_id            =   models.ForeignKey('shift_master')             
    emp_weekdays            =   models.BooleanField()
    emp_weekends            =   models.BooleanField()
    emp_isactive            =   models.BooleanField()
    class Meta:
        db_table            =   'emp_shifts'

views.py
@csrf_exempt
@api_view(['POST'])
def createEmpShift(request):
    if request.method == 'POST':
        data = request.data
        serializer = empAllShiftsSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
    return Response(serializer.errors)

serializers.py
class empListSerializer(serializers.ModelSerializer):
    class Meta:
        model = emp_details
        #fields = '__all__'
        exclude = ('emp_created_by','emp_created_time','emp_updated_by','emp_updated_time')

class allShiftsSerializer(serializers.ModelSerializer):
    class Meta:
        model = shift_master
        fields = ('emp_shift_id','emp_shift_name','emp_shift_from','emp_shift_to')

class empAllShiftsSerializer(serializers.ModelSerializer):
    emp_id = empListSerializer()
    emp_shift_id = allShiftsSerializer()
    class Meta:
        model = emp_shifts
        fields = '__all__'

我无法保存数据。 如果我发送

{
    "emp_code":"R103AB",
    "shift_name":"Morning Shift",
    "emp_weekdays":1,
    "emp_weekends":0,
    "isactive":1
}
来自邮差的

给出了错误

{
  "emp_id": [
    "This field is required."
  ],
  "emp_shift_id": [
    "This field is required."
  ]
}

我知道这里的问题。我需要从Foreignkey关系表中传递emp_id,emp_shift_id。 我能够获取emp_code主键和shift_name主键。但是如何将这两个值发送到

  

empAllShiftsSerializer()

这里成功发布数据。 如果我错了,请纠正我。

1 个答案:

答案 0 :(得分:0)

我认为您需要覆盖empAllShiftsSerializer序列化程序中的方法创建。

看看here

基本上,重写此方法可以定义您希望接收外部对象的pk,获取对象并添加您正在创建的对象。

示例:

    class empAllShiftsSerializer(serializers.ModelSerializer):
        emp_id = empListSerializer()
        emp_shift_id = allShiftsSerializer()
        class Meta:
            model = emp_shifts
            fields = '__all__'
        def create(self, validated_data):
            emp_id = validated_data.pop('emp_id')
            emp_shift_id = validated_data.pop('emp_shift_id')
            emp_object = emp_details.objects.get(pk=emp_id)
            emp_shift_object = shift_master.objects.get(pk=emp_shift_id)

            emp_shift_object = emp_shifts.objects.create(emp=emp_object, emp_shift=emp_shift_object, **validation_data)

            return emp_shift_object

注意:我没有测试过此代码,这只是一个例子,可以更好地解释我的回复。