Ошибка значения: Поле «идентификатор» ожидало число, но получило строку в структуре Django Rest

#python #django #django-rest-framework

#питон #джанго #django-rest-фреймворк

Вопрос:

В DRF я сталкиваюсь с проблемой, всякий раз, когда я делаю запрос POST на конечной точке, в поле «имя», которое является текстовым полем, я получаю исключение «Поле» идентификатор «ожидало числа, но получило» НАЗВАНИЕ»», но когда я изменяю значение » имя » на целое число, запрос выполнен успешно, я не понимаю, потому что имя-это текстовое поле в модели и почему его идентификатор и поле имени смешиваются друг с другом. Я удалил файлы миграции из проекта и базы данных и повторно запустил миграции, но все еще сталкиваюсь с этой проблемой. Ниже приведен мой код:

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__'  

Комментарии:

1. Пожалуйста, опубликуйте свой код Project.verify_project_name(…)

Ответ №1:

Более общее и нестандартное решение-использовать 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")