#python #django #django-rest-framework
#питон #джанго #django-rest-framework
Вопрос:
Я пытаюсь отправить несколько изображений через POSTMAN в свой API. Тем не менее, я все время получаю 206 status
информацию, которая возвращается, если serializer.is_valid()
ее нет True
. Более того, serializer.errors
пусто для каждого запроса. Он работал нормально до того, как я добавил поле изображений. MEDIA_ROOT
и MEDIA_URL
поля уже созданы.
Это хорошо работает с использованием страницы администратора Django.
Я отправляю запрос с помощью POSTMAN. Ответ, который я получаю:
{
"data": {}
}
Заголовки:
Accept: application/json
Content-Type: application/json
Models.py
class Order(models.Model):
id = models.UUIDField(
primary_key=True,
db_index=True,
editable=False,
default=uuid4,
)
city = models.CharField(
max_length=50,
verbose_name = (u'City'),
default="NY",
)
description=models.CharField(
max_length=255,
verbose_name=(u'desc'),
default="Офигенная хата",
)
price = models.PositiveIntegerField(
default=0,
verbose_name=(u'Price')
)
requirements = models.CharField(
max_length=50,
verbose_name = (u'Req'),
default="Clean"
)
address = models.CharField(
max_length=50,
verbose_name = (Address'),
default="Wall st"
)
roommates_needed= models.PositiveIntegerField(
verbose_name=(u''),
default=None
)
images = models.FileField(
upload_to = 'pic_folder/%Y/%m/%d/',
default = 'pic_folder/None/no-img.jpg',
verbose_name = (img'),
blank = True,
)
gender_choices=(
(1, u'Lady'),
(2, u'Boy'),
(3, u'anyone')
)
roommate_gender = models.PositiveIntegerField(
choices=gender_choices,
default=3,
verbose_name=(u'gender '),)
status_choices = (
(1, u'Active'),
(2, u'Not active'),
(3, u'Blocked'),
)
status = models.PositiveIntegerField(
default=1,
choices=status_choices,
verbose_name=(u'Status'))
owner = models.OneToOneField(
'User',
on_delete=models.CASCADE,
verbose_name=(u'Owner'),)
def __str__(self):
return self.owner.name
class Meta:
verbose_name = (order')
verbose_name_plural = (u'3. Order list')
serializer.py
def post(self, request, format=None):
serializer = OrderPostSerializer(data=request.data.copy(), partial=True)
queryset = Order.objects.all()
parser_classes = (MultiPartParser,)
## Проверяем совпадает ли токен передаваемый пользователем с тем что в настройках, авторизован он или нет.
if not settings.DEBUG:
token = request.META.get('HTTP_TOKEN', '')
if token != settings.MAINMODULE_TOKEN:
return Response({'detail': 'unauthorized'}, status=status.HTTP_401_UNAUTHORIZED)
if serializer.is_valid() in request.data:
serializer.save()
perform_create()
return Response({'data': serializer.data}, status=status.HTTP_201_CREATED)
else:
return Response({'data': serializer.errors}, status=status.HTTP_206_PARTIAL_CONTENT)
def perform_create(self, serializer):
serializer.save(content_object=self.request.user, image=self.request.FILES.get('images'))
Ответ №1:
Нет, сериализатор не является недопустимым. Этот тест:
if serializer.is_valid() in request.data:
проверяет, что True (или False) находится в данных запроса, чего не будет. Удалите это in
:
if serializer.is_valid():
(Также обратите внимание, что ваши переменные queryset и parser_classes не используются. Похоже, вы скопировали их из представления на основе классов, они вам не нужны в этом представлении функций.)
Комментарии:
1. Спасибо, теперь это работает. У меня есть такая проверка, если serializer.is_valid() в request.data, в любом другом сериализаторе. Однако они работают хорошо, так что же не так с этим?
2. Ну, может быть, некоторые из ваших других запросов содержат True или False в качестве ключа, хотя я не могу понять, почему они это делают. Но зачем вам вообще использовать этот код? Вам нужно писать код намеренно. Напишите код, который означает то, что вы подразумеваете.