#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")