10

В Django REST framework (2.1.16) У меня есть модель с нулевым полем FK type, но запрос на создание POST дает 400 bad request, в котором говорится, что это поле не требуется.Nullable ForeignKey поля в Django REST framework

Моя модель

class Product(Model): 
    barcode = models.CharField(max_length=13) 
    type = models.ForeignKey(ProdType, null=True, blank=True) 

и сериализатору является:

class ProductSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Product 
     exclude = ('id') 

Я пытался добавить type явно сериализатором как

class ProductSerializer(serializers.ModelSerializer): 
    type = serializers.PrimaryKeyRelatedField(null=True, source='type') 
    class Meta: 
     model = Product 
     exclude = ('id') 

и это не имеет никакого эффекта.

От http://django-rest-framework.org/topics/release-notes.html#21x-series Я вижу, что была ошибка, но она была исправлена ​​в 2.1.7.

Как изменить сериализатор для правильной обработки моего поля FK?

Спасибо!


UPDATE: из оболочки дает

>>> serializer = ProductSerializer(data={'barcode': 'foo', 'type': None}) 
>>> print serializer.is_valid() 
True 
>>> 
>>> print serializer.errors 
{} 

, но без типа = Нет:

>>> serializer = ProductSerializer(data={'barcode': 'foo'}) 
>>> print serializer.is_valid() 
False 
>>> print serializer.errors 
{'type': [u'This field is required.']} 
>>> serializer.fields['type'] 
<rest_framework.relations.PrimaryKeyRelatedField object at 0x22a6cd0> 
>>> print serializer.errors 
{'type': [u'This field is required.']} 

в обеих случаях это дает

>>> serializer.fields['type'].null 
True 
>>> serializer.fields['type'].__dict__ 
{'read_only': False, ..., 'parent': <prodcomp.serializers.ProductSerializer object at 0x22a68d0>, ...'_queryset': <mptt.managers.TreeManager object at 0x21bd1d0>, 'required': True, 
+0

Не думаю, что это связано с вашим вопросом, но выглядит как те 'exclude' опций не хватает запятая, которая заставила бы их рассматривать как кортежи. 'exclude = ('id',)' –

+0

Также обратите внимание, что вам не нужен 'source = 'type'', так как в этом случае имя поля уже соответствует источнику, который вы хотите использовать. –

+0

@TomChristie да, я пробовал сначала без 'source = 'type'' –

ответ

5

Я не уверен, что происходит там, у нас есть покрытие для этого случая, и подобные случаи работают отлично для меня.

Возможно, попробуйте заглянуть в оболочку и напрямую осмотреть сериализатор.

Например, если вы создаете экземпляр сериализатора, что возвращает serializer.fields? Как насчет serializer.field['type'].null? Если вы передаете данные в сериализатор непосредственно в оболочке, какие результаты вы получите?

Например:

serializer = ProductSerializer(data={'barcode': 'foo', 'type': None}) 
print serializer.is_valid() 
print serializer.errors 

Если вы получите ответы на некоторые те, обновить вопрос, и мы посмотрим, сможем ли мы выкручиваться.

Редактировать

Хорошо, что объясняет вещи лучше. Поле «type» имеет значение NULL, поэтому оно может быть None, но оно по-прежнему является обязательным. Если вы хотите, чтобы он был нулевым, вы должны явно указать его на None.

Если вы действительно хотите, чтобы исключить поле при отправке данных, вы можете включить флаг required=False в поле сериализатора.

+1

спасибо, я обновил вопрос с помощью вывода из оболочки. –

+1

спасибо, добавив 'serial = serializers.PrimaryKeyRelatedField (required = False)' в сериализатор. (Thought 'null = True' означает то же самое) –

+4

На всякий случай кто-то ищет нулевое поле и также наткнулся на этот поток: Если вы хотите явно разрешить поле для NULL для поля PrimaryKeyRelatedField, вы должны добавить: allow_null = True :) – gabn88

6

Добавьте kwarg allow_null при инициализации сериалайзер:

class ProductSerializer(serializers.ModelSerializer): 
    type = serializers.PrimaryKeyRelatedField(null=True, source='type', allow_null=True) 

Как уже говорилось в комментарии @ gabn88, но я думаю, что это гарантирует его собственный ответ. (Стоимость меня какое-то время, потому что я только прочитал, что комментарий после того, как найти его самостоятельно.)

См http://www.django-rest-framework.org/api-guide/relations/

Смежные вопросы