Как вернуть manytomanyfield как объект в Django RestFramework API

Я пытался создать API с помощью Django RestFramework, поэтому я создал 2 модели Note и Task и имею ManyToManyField в модели Note, чтобы я мог поместить много Task в Note, но API, который я создал, не возвращает полную характеристику объекта, а только id. Вот мой код:

class NoteAPI(ListAPIView):
    serializer_class = NoteSerializer
    queryset = Note.objects.all()

Вот мои модели:

class Task(models.Model):
    task = models.CharField(max_length=255, null=False, blank=False)
    detail = models.CharField(max_length=255, null=True, blank=True)
    completed = models.BooleanField(default=False)
    priority = models.IntegerField(default=0)
    def __str__(self):
        return self.task

class Note(models.Model):
    title = models.CharField(max_length=255, null=False, blank=False)
    priority = models.CharField(max_length=1, choices=PRIORITY_CHOICES, default="B")
    detail = models.CharField(max_length=255, null=True, blank=True)
    completed = models.BooleanField(default=False)
    task = models.ManyToManyField(Task, related_name="note_task", blank=True)
    process = models.IntegerField( default=0, validators=[max_int_value])
    def __str__(self) -> str:
        return self.title + " is "+ str(self.process) + "% completed"

И я хочу, чтобы результат выглядел так:

 [
    {
            "id": 2,
            "title": "Sleep",
            "priority": "F",
            "detail": "Don't do it, stay awake and do your job",
            "completed": false,
            "process": 0,
            "task": [
                      {
                         "id": 1,
                         "task": "Go to bed",
                         "completed": false
                      },
                     {
                         "id": 2,
                         "task": "Start counting",
                         "completed": false
                      }
                    ]
     }
 ]

Но на самом деле это будет так

 [
    {
            "id": 2,
            "title": "Sleep",
            "priority": "F",
            "detail": "Don't do it, stay awake and do your job",
            "completed": false,
            "process": 0,
            "task": [
                      1,
                      2
                 ]
     }
 ]

Что я могу сделать, чтобы получить такой результат?

Вам нужно сообщить NoteSerializer как сериализовать Task objectcs.

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = ("id", "task", "completed")


class NoteSerializer(models.Model):
    task = TaskSerializer(many=True)

Вероятно, вы также хотите префетчить задачи, чтобы свести количество запросов к БД к минимуму.

class NoteAPI(ListAPIView):
    serializer_class = NoteSerializer
    queryset = Note.objects.prefetch_related("task").all()
Вернуться на верх