2017-07-21 18 views
0

とモデル作成:Djangoは、私は次のようなモデル持っている外部キー

class Task(models.Model): 
    what_task = models.CharField(max_length=100,) 

    #This helps to print in admin interface 
    def __str__(self): 
     return u"%s" % (self.what_task) 


class Step(models.Model): 
    task = models.ForeignKey(Task, related_name='steps', on_delete=models.CASCADE,) 
    what_step = models.CharField(max_length=50, blank=True,) 

    #This helps to print in admin interface 
    def __str__(self): 
     return u"%s" % (self.what_step) 

私はシリアライザ持っている:

class StepSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Step 
     fields = '__all__' 

class TaskSerializer(serializers.ModelSerializer): 
    steps = StepSerializer(many=True) 
    class Meta: 
     model = Task 
     fields = '__all__' 

    def create(self, validated_data): 
     steps_data = validated_data.pop('steps') 
     task = Task.objects.create(**validated_data) 
     for step_data in steps_data: 
      Step.objects.create(task=task, **step_data) 
     return task 

と私の意見:

@api_view(['GET', 'POST']) 
def task_list(request): 
    """ 
    List all tasks, or create a new task. 
    """ 
    if request.method == 'GET': 
     tasks = Task.objects.all() 
     serializer = TaskSerializer(tasks, many=True) 
     return Response(serializer.data) 

    elif request.method == 'POST': 
     serializer = TaskSerializer(data=request.data) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     else: 
      return Response(
       serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

が、私はそのとき、私期待していますがタスクを作成する、私はそれも単一の要求のステップを作成します。

{what_task: "Sample task three", steps:[{task: 0, what_step: "Test Step"}]} 

これは私に{"steps":[{"task":["This field is required."]}]}エラーがスローされます:フロントエンドから送られた私の要求JSONは次のようになります。私は間違って何をしていますか?間違ったJSONを送信していますか?

P.S.:私は作成時にタスクIDを持っていないので、0を送信していましたが、正しい値でなければなりません。バックエンドでどのように処理すると思いますか?

答えて

1

StepSerializerは、TaskというIDを受け取る予定です。あなたの状況では、親シリアライザ(TaskSerializer)から取得する必要はありません。

ちょうどあなたのStepSerializerexcludeにタスクフィールド変更:表示したい場合にもread_onlyとしてそのフィールドを設定するかもしれませんが、それはTaskに含まれているとして、それは必要ありません

class StepSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Step 
     exclude = ('task',) 

を。

いずれにしても、stepstaskフィールドを省略することができます(設定した値は無視されます)。

+0

お返事ありがとうございました。出来た :) – Nitish

関連する問題