Неверные поля ForeignKey в структуре REST Django
В структуре Django REST (2.1.16) у меня есть модель с нулевым полем FK type
, но запрос создания POST дает 400 bad request
, в котором говорится, что это поле необходимо.
Моя модель
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
{}
но без type = None:
>>> 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,
Ответы
Ответ 1
Я не уверен, что происходит там, у нас есть освещение для этого случая, и подобные случаи работают отлично для меня.
Возможно, попробуйте зайти в оболочку и напрямую проверить сериализатор.
Например, если вы создаете экземпляр сериализатора, что возвращает serializer.fields
? Как насчет serializer.field['type'].null
? Если вы передадите данные в сериализатор непосредственно в оболочке, какие результаты вы получите?
Например:
serializer = ProductSerializer(data={'barcode': 'foo', 'type': None})
print serializer.is_valid()
print serializer.errors
Если вы получите ответы на эти вопросы, обновите вопрос, и мы увидим, можем ли мы его отсортировать.
Edit
Хорошо, это объясняет все лучше. Поле "type" имеет значение NULL, поэтому оно может быть None
, но оно все еще является обязательным. Если вы хотите, чтобы он был нулевым, вы должны явно указать его на None
.
Если вы действительно хотите, чтобы исключить поле при отправке данных, вы можете включить флаг required=False
в поле сериализатора.
Ответ 2
Добавьте инициализацию сериализатора 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/