Предоставление пользовательского поля в сериализаторе с использованием данных модели

В модели Problem я храню список пользователей, которые ее решили. В сериализаторе Problem, когда пользователь будет запрашивать свои данные, я хочу показать ему, выполнил ли он определенную задачу. Поэтому я создал пользовательское поле в классе сериализатора и хочу заполнить его, используя данные модели.

вот что я сделал.

from rest_framework import serializers
from dsa.models import Problem

class ProblemSerializer(serializers.ModelSerializer):
    isDoneByUser = serializers.BooleanField(default=False)
    class Meta:
        model = Problem
        fields = ['id', 'topic', 'title', 'link', 'isDoneByUser']

    def perform_create(self, serializer):
        user = self.request.user
        userlist = serializer.data.get('isDone')
        print(userlist)

        if user in userlist:
            self.isDoneByUser = True

вот модель

from django.db import models
from django.contrib.auth.models import User

class Problem(models.Model):
    topic = models.CharField(max_length=100)
    title = models.CharField(max_length=100)
    link = models.URLField()
    isDone = models.ManyToManyField(User)

    class Meta:
        ordering = ['topic']

Но при этом всегда устанавливается isDoneByUser = False (значение по умолчанию)

прошу помощи!

Вы не можете установить isDoneByUser в True, так как оно не существует в вашей модели.

Однако вы можете получить булево значение с помощью SerializerMethodField:

class ProblemSerializer(serializers.ModelSerializer):
    isDoneByUser = serializers.SerializerMethodField()

    def get_isDoneByUser(self, instance):
        user = self.context['request'].user
        return instance.isDone.filter(pk=user.pk).exists()

    class Meta:
        model = Problem
        fields = ['id', 'topic', 'title', 'link', 'isDoneByUser']
Вернуться на верх