В 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,
Не думаю, что это связано с вашим вопросом, но выглядит как те 'exclude' опций не хватает запятая, которая заставила бы их рассматривать как кортежи. 'exclude = ('id',)' –
Также обратите внимание, что вам не нужен 'source = 'type'', так как в этом случае имя поля уже соответствует источнику, который вы хотите использовать. –
@TomChristie да, я пробовал сначала без 'source = 'type'' –