HyperlinkedRelatedField required = False不起作用

时间:2015-10-17 21:49:21

标签: django django-rest-framework

似乎无论我做什么,我都无法获得parent字段。我正在使用DRF版本3.2.3和Django 1.8.4。

字段的模型定义:

parent = models.ForeignKey(
    "self", verbose_name=_("Parent"), blank=True, null=True,
    default=None, related_name='children')

该模型还有一个unique_together

unique_together = (('owner', 'parent', 'name',),)

字段的串行器定义:

parent = serializers.HyperlinkedRelatedField(
    view_name='category-detail', queryset=Category.objects.all(),
    required=False)

我正在编写单元测试,响应代码为400,文本响应为:

{'parent': [u'This field is required.']}

parent字段是返回同一表中另一行的ForeignKey。

Gals / Guys有任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

有时,某个字段可以通过其他一些代码隐式地生成required。我遇到的一个案例是模型级unique_together约束,它使序列化程序级别所需的所有包含字段成为可能。来自doc

  

注意UniqueTogetherValidation类总是强加一个隐式约束,它应用的所有字段总是   按要求处理。具有默认值的字段是例外   这是因为即使从用户输入中省略它们也总是提供一个值。

我认为您必须覆盖序列化程序save或viewset create/update才能将值设置为您想要的值。另一种方法是尝试从UniqueTogetherValidator中的序列化程序验证程序中删除__init__。另一方面,我认为这是有原因的。

值得一提的是,在admin和其他任何地方使用ModelForm时,都不需要这些字段,因为ModelForm完全是另一回事,它以自己的方式处理验证。