Как опубликовать значение поля manytomany в Postman для API
У меня есть поле, которое является ManyToMany. Я хочу ввести значение в POSTMAN для пост-операции API. Но каждый раз он говорит: "This field is required.", хотя я указал значение.
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',)