2016-07-22 9 views
0

こんにちは、私はdjango serializers.facingの小さな問題をPOSTシリアライザで初めて知っています。Django POSTシリアライザForeignkeyネストされたデータ

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 
} 

を送信する場合、そのはhere.I FOREIGNKEY関係テーブルからEMP_ID、emp_shift_idを渡す必要があり、私はこの問題を知っているエラー

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

を与えます。 は私がemp_code主キーを取得し、

empAllShiftsSerializer()ここで

に二つの値が正常にデータをPOSTすることを送信する方法を主key.Butをshift_nameすることができています。 私がここで間違っている場合は私を修正してください。

答えて

0

シリアライザempAllShiftsSerializerで作成するメソッドをオーバーライドする必要があると思います。

はあなたが、異物のためにPKを受け取るオブジェクトを取得し、作成されたオブジェクトに追加することを定義することができ、このメソッドをオーバーライドし、基本的な外観here

してください。

例:

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 

注:私はこのコードをテストしていない、それはより良い私の応答を説明するためだけの例です。

+0

シリアライザを使用せずにviews.pyのemp_shifts.objects.create()からデータを保存できますか? – user1335606

+0

私はそう思います。しかし、私が答えを示すように、最良の選択肢はSerializerクラスのcreateメソッドをオーバーライドしてシリアライザを使い続けることです。 – edgarzamora

+0

はい。うまくいきます。ありがとうございます。 – user1335606

関連する問題