簡體   English   中英

Django Rest 框架嵌套可寫序列化器

[英]Django Rest Framework nested writable Serializers

我想創建一個具有 2 個或更多級別的可寫多級序列化程序。 但是當我使用下面的代碼時。 我收到 Response BAD REQUEST 400。當我排除 TaskSerializer 它的工作(1Level)但更多嵌套時它不工作。 我能做什么它有效嗎?

提前致謝。

視圖.py

class BoardView(APIView):

def get(self, request, email):
    user = User.objects.get(email=email)
    boards = Boards.objects.filter(board_creator=user.id)
    serializer = BoardsSerializer(instance=boards, many=True)
    return Response(serializer.data)

def post(self, request, email):
    response = Response()
    data = request.data['board']
    user = User.objects.filter(
        email=data['board_creator']).first()

    if user is None:
        response.data = {
            'detail': 'User not found'
        }
        response.status_code = status.HTTP_404_NOT_FOUND
        return response

    boards_by_user = Boards.objects.filter(board_creator=user.id)
    board_len = boards_by_user.filter(
        board_name=data['name'])

    if len(board_len) > 0:
        response.data = {
            'detail': 'Board already exists'
        }
        response.status_code = status.HTTP_409_CONFLICT
        return response

    data['board_creator'] = user.id
    print(data)
    serializer = BoardsSerializer(data=data)
    if serializer.is_valid():
        serializer.save()
        response.status_code = status.HTTP_201_CREATED
        response.data = {
            'detail': 'Board created successfully'
        }
        return response

    response.status_code = status.HTTP_400_BAD_REQUEST
    return response

model.py

class Boards(models.Model):
    board_name = models.CharField(max_length=255, null=None)
    board_creator = models.ForeignKey(to=User, on_delete=models.CASCADE)

    def __str__(self) -> str:
        return str(self.board_name)


class Columns(models.Model):
    column_name = models.CharField(max_length=255, null=None)
    board = models.ForeignKey(
        to=Boards, on_delete=models.CASCADE, related_name='columns')

    def __str__(self) -> str:
        return str(self.column_name)


class Tasks(models.Model):
    task_title = models.CharField(max_length=255, null=None)
    task_description = models.TextField(null=True, blank=True)
    task_created = models.DateTimeField(default=timezone.now)
    task_finish = models.DateTimeField(null=True, blank=True)
    colmun = models.ForeignKey(
        to=Columns, on_delete=models.CASCADE, related_name='tasks')

    def __str__(self) -> str:
        return str(self.task_title)


class Subtasks(models.Model):
    subtasks_titel = models.CharField(max_length=255, null=None)
    task = models.ForeignKey(
        to=Tasks, on_delete=models.CASCADE, related_name='subtasks')
    subtask_complete = models.BooleanField(default=False)

序列化器.py

class TaskSerializer(serializers.ModelSerializer):

    title = serializers.CharField(source='task_title')
    description = serializers.CharField(source='task_description')
    finish = serializers.DateTimeField(source='task_finish')
    #subtasks = SubtasksSerializer(many=True)

    class Meta:
        model = Tasks
        fields = ['id', 'title', 'description','finish']
        read_only_fields = ['id', 'finish']


class ColumnsSerializer(serializers.ModelSerializer):
    name = serializers.CharField(source='column_name')
    tasks = TaskSerializer(many=True)

    class Meta:
        model = Columns
        fields = ['id', 'name', 'tasks']
        read_only_fields = ['id']

    def create(self, validated_data):
        tasks = validated_data.pop('tasks')
        column = Columns.objects.create(**validated_data)
        for task_data in tasks:
            Tasks.objects.create(column=column, **task_data)
            #column.tasks.add(task)
        return column


class BoardsSerializer(serializers.ModelSerializer):

    columns = ColumnsSerializer(many=True)
    name = serializers.CharField(source='board_name')

    class Meta:
        model = Boards
        fields = ['id', 'name', 'columns', 'board_creator']
        read_only_fields = ['id']
        extra_kwargs = {
            'board_creator': {'write_only': True}
        }

    def create(self, validated_data):
        columns = validated_data.pop('columns')
        board = Boards.objects.create(**validated_data)
        for column_data in columns:
            tasks = column_data.pop('tasks')
            Columns.objects.create(board=board, **column_data)
            #board.columns.add(column)
        return board

郵政 JSON

{"board":{
  "name": "004dsfd5d85",
  "board_creator":"admin@admin.de", 
  "columns": [
    {"name":"TEST", "tasks":[{"title":"test"}]},
    {"name":"TEST2", "tasks":[{"title":"test"}]}
    ]}
}
{
  "name": "004dsfd5d85",
  "board_creator":"admin@admin.de", 
  "columns": [
    {"name": "TEST", "tasks":[{"title": "test"}]},
    {"name":"TEST2", "tasks":[{"title":"test"}]}
    ]
}

這是一個有效的 JSON 格式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM