Подтвердить что ты не робот

Неверные поля 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, 
4b9b3361

Ответ 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/