Как опубликовать значение поля manytomany в Postman для API

У меня есть поле, которое является ManyToMany. Я хочу ввести значение в POSTMAN для пост-операции API. Но каждый раз он говорит: "This field is required.", хотя я указал значение. enter image description here

enter image description here

Serializer:

class DaySerializer(serializers.ModelSerializer):

class Meta:
    model = Day 
    fields = '__all__'
    


class TutorProfileSerializer(serializers.ModelSerializer):

    user = serializers.PrimaryKeyRelatedField(
        read_only=True, default=serializers.CurrentUserDefault(), source='user.username')
    image_url = serializers.SerializerMethodField('get_image_url')
    
    tutor_availablility = DaySerializer(many=True)

    class Meta:
        model = TutorProfile
        fields = '__all__'

Если tutor_availability является полем TutorProfile следующим образом:

class Day(models.Model):
    # your fields here


class TutorProfile(models.Model):
    tutor_availability = models.ManyToManyField(Day)
    # the rest of your fields here

С этим набором представлений:

from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet


class TutorProfileViewSet(mixins.CreateModelMixin, GenericViewSet):
    serializer_class = TutorProfileSerializer

Просто удалите явное поле tutor_availability из сериализатора, и это будет сделано:

class DaySerializer(serializers.ModelSerializer):
    class Meta:
        model = Day
        fields = "__all__"


class TutorProfileSerializer(serializers.ModelSerializer):
    user = serializers.PrimaryKeyRelatedField(
        read_only=True, default=serializers.CurrentUserDefault(), source='user.username')
    image_url = serializers.SerializerMethodField('get_image_url')

    class Meta:
        model = TutorProfile
        fields = '__all__'

Тогда, отправив поле tutor_availability так, как вы это делаете, оно должно сработать.

В вашем TutorProfileSerializer вы используете DaySerializer для поля tutor_availablility, поэтому когда вы делаете запрос на пост, ваше действие post будет ждать список dict, что вам нужно сделать в первую очередь, это удалить эту строку : из вашего TutorProfileSerializer и он будет работать.

tutor_availablility = DaySerializer(many=True)

Если у вас все еще есть проблема, то вам нужно проверить метод validate в TutorProfileSerializer.

А если это работает, но вы хотите получить список dict(объекта Day) для GET запроса, вам нужно переопределить get_serializer_class() вашего ViewSet и создать два сериализатора один для post запроса и второй для get запроса:

@authentication_classes([TokenAuthentication])
@permission_classes([IsAuthenticated])
class TutorprofileViewSet(ModelViewSet):
    serializer_class = TutorProfileSerializer
    http_method_names = ["post", "delete", "get"]
    queryset = TutorProfile.objects.all()

def get_serializer_class(self):
    if self.action.method == 'GET':
        return TutorGETProfileSerializer
    return super(TutorprofileViewSet, self).get_serializer_class()

и 2 сериализатора:

class TutorGETProfileSerializer(serializers.ModelSerializer):

    user = serializers.PrimaryKeyRelatedField(
        read_only=True, default=serializers.CurrentUserDefault(), source='user.username')
    image_url = serializers.SerializerMethodField('get_image_url')
    
    tutor_availablility = DaySerializer(many=True)

    class Meta:
        model = TutorProfile
        fields = '__all__'

class TutorProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = TutorProfile
        fields = '__all__'
        read_only_fields = ('user',)
Вернуться на верх