ValueError: Поле 'id' ожидало число, но получило строку в Django Rest Framework

В DRF я столкнулся с проблемой, когда я делаю POST запрос на конечной точке, на поле "name", которое является текстовым полем, я получаю исключение "Field 'id' expected a number but got 'TITLE'", но когда я меняю значение "name" на целое число, запрос проходит успешно Я не понимаю этого, потому что name является TextField в модели и почему он смешивает Id и Name поля друг с другом. Я удалил файлы миграции из проекта и БД и запустил миграции заново, но все равно столкнулся с этой проблемой. Ниже приведен мой код:

models.py

class Project(models.Model):
    admin = models.ForeignKey(User, on_delete=models.CASCADE, related_name='project_crated_by')
    name = models.TextField(max_length=225, blank=False, null=False)
    project_members = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='members', null=True, blank=True)
    created_on = models.DateField(default=timezone.now)
    tags = ArrayField(models.CharField(max_length=225, default=''), blank=True)

    def __str__(self):
        return self.name

    objects = models.Manager()

views.py

class ProjectView(viewsets.ViewSet):

    def create(self, request):
        project_name_exist = Project.verify_project_name(request.data['admin'], request.data['name'])
        if project_name_exist:
            return Response({'message': 'You already have a project with this name',
                             'status': status.HTTP_200_OK})
        serialized_project = ProjectSerializer(data=request.data)

        if serialized_project.is_valid():
            serialized_project.save()
            return Response({'message': 'Project Created Successfully', 'status': status.HTTP_201_CREATED})
        else:
            return Response({'error': serialized_project.errors, 'status': status.HTTP_400_BAD_REQUEST})

serializer.py

class ProjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Project
        fields = '__all__'

Более общее и не-DIY решение - использовать UniqueTogetherValidator в вашем сериализаторе и позволить Django разобраться с этим.

from rest_framework.validators import UniqueTogetherValidator

class ProjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Project
        fields = '__all__'

        validators = [
            UniqueTogetherValidator(
                queryset=Project.objects.all(),
                fields=['admin', 'name'],
                message='You already have a project with this name'
            )
        ]
       

И/или добавьте его в модель для принудительного применения к базе данных.

class Project(models.Model):
    admin = models.ForeignKey(User, on_delete=models.CASCADE, related_name='project_crated_by')
    name = models.TextField(max_length=225, blank=False, null=False)
    project_members = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='members', null=True, blank=True)
    created_on = models.DateField(default=timezone.now)
    tags = ArrayField(models.CharField(max_length=225, default=''), blank=True)

    def __str__(self):
        return self.name

    objects = models.Manager()

    class Meta:
        unique_together = ("admin", "name")
Вернуться на верх