Как сериализовать несколько объектов модели?

Я создаю API с использованием Django Restframework, которому нужны данные из нескольких моделей. Я получил много ответов на мои требования, но они не работают.

У меня есть следующие модели

class Task(models.Model):
    title = models.CharField(max_length=200)
    completed = models.BooleanField(default=False, blank=True, null=True)

    def __str__(self):
        return self.title

class Task_extended(models.Model):
    task_id = models.ForeignKey(Task, on_delete = models.CASCADE,related_name='task_extendeds')
    field_3 = models.CharField(max_length=200)
    field_5 = models.CharField(max_length=200)
    field_4 = models.BooleanField(default=False, blank=True, null=True)

    def __str__(self):
        return self.field_3

Вот моя функция просмотра

@api_view(['GET','POST'])
def taskList(request):
    tasks = Task.objects.all()
    serializer = TaskSerializer(tasks, many =True)
    return Response(serializer.data)

Serializer.py

class TaskSerializer(serializers.ModelSerializer):
    task_extendeds = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
    class Meta:
        model = Task
        fields = "__all__"
        depth = 1

Я получаю json в следующем виде

[
    {
        "id": 2,
        "task_extendeds": [
            1,
            2,
            3
        ],
        "title": "Start Rest Framework",
        "completed": false
    }
]

Какие изменения я должен сделать в Serializers.py, чтобы мой вывод json был следующим

[
    {
        "id": 2,
        "title": "Start Rest Framework",
        "completed": false,
        "task_extendeds": [
            {
                "field_3": "Field 3 Data",
                "field_4": "Field 4 Data",
                "field_5": "Field 5 Data"
            },
            {
                "field_3": "Field 3 Data",
                "field_4": "Field 4 Data",
                "field_5": "Field 5 Data"
            },
            {
                "field_3": "Field 3 Data",
                "field_4": "Field 4 Data",
                "field_5": "Field 5 Data"
            }
        ],
        
    }
]

Атрибут depth = 1 в мета-классе должен был выполнить работу, согласно другим вопросам stackoverflow, но он не работает.

Вы используете субсериализатор, поэтому:

class Task_extendedSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task_extended
        fields = ['field_3', 'field_4', 'field_5']

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

В представлении вы можете повысить эффективность, предварительно выполнив выборку task_extendeds:

@api_view(['GET'])
def taskList(request):
    tasks = Task.objects.prefetch_related('task_extendeds')
    serializer = TaskSerializer(tasks, many=True)
    return Response(serializer.data)

Примечание: Модели в Django пишутся в PascalCase, а не snake_case, поэтому вы можете переименовать модель из Task_extended в TaskExtended.

Сначала напишите Task_extendedSerializer, затем используйте его в TaskSerializer

class Task_extendedSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task_extended
        fields = ('field_3', 'field_4', 'field_5')


class TaskSerializer(serializers.ModelSerializer):
    task_extendeds = Task_extendedSerializer()
    class Meta:
        model = Task
        fields = ('id', 'title', 'completed', 'task_extendeds')


Вернуться на верх