2015-10-17 62 views
3

看起來不管我做什麼我都不能得到parent這個字段不需要。我正在使用DRF版本3.2.3和Django 1.8.4。場的HyperlinkedRelatedField required = False not working

模型定義:

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有什麼想法如何解決這個問題?

+0

我有一個版本:有時一個字段可以通過其他一段代碼隱式地做'required'。我遇到的一個案例是模型級別的'unique_together'約束,它使序列化器級別上的所有包含字段成爲必需。這可能是你的情況嗎? – Ivan

+0

Ivan,從來沒有想到這一點,是的,它在我的'unique_together'約束,但它可以是NULL,即使它在約束。我通過使用'parent' NULL的管理員創建了一個對象,它工作。但是,這在串行器中不起作用。它想要一個'Category'對象,並且不允許NULL/None。 – cnobile

+0

我想你只需要重寫序列化程序'save'或viewset'create/update'就可以將值設置爲你想要的值。另一種選擇是嘗試從init的序列化程序的驗證程序中刪除['UniqueTogetherValidator'](http://www.django-rest-framework.org/api-guide/validators/#uniquetogethervalidator)。另一方面,我認爲這是有原因的。 – Ivan

回答

0

有時可以通過其他代碼隱含地創建一個字段required。我遇到的一種情況是模型級unique_together約束,它使序列化器級別上的所有包含字段成爲必需。從doc

注意:本UniqueTogetherValidation類總是規定適用所有的領域總是要求 處理一個隱含的約束。具有默認值的字段是 的例外,因爲它們總是提供一個值,即使從用戶輸入中省略也是如此。

我認爲你將不得不重寫串行save或視圖集中create/update的值設置爲你想要在這一點上有什麼。另一種方法是嘗試從__init__中的序列化器驗證程序中刪除UniqueTogetherValidator。另一方面,我認爲這是有原因的。

值得一提的是,在管理員和其他任何地方使用ModelForm,這些字段將不再需要,因爲ModelForm是另一回事,它以自己的方式處理驗證。