2015-12-17 21 views
0

我想在我的Django模型中存儲字符串列表中的字段(我不想使用相關字段出於某些原因,只驗證用戶發送了正確的列表)。如何使ModelSerializer DRF中的ListField不是必需的

我有它正確的工作,問題是,我不成功,當通過Django REST框架更新對象時,這個字段不是強制性的。

這是我的實現,我測試了一些變化具有相同的結果

class SomeModel(models.Model): 
    hashtags = models.CharField(max_length=512, default=None, null=True, blank=True) 

    @property 
    def hashtags_as_list(self): 
     """ Hashtags are stored on DB as a text json convert to object again 
     """ 
     return json.loads(self.hashtags) if self.hashtags else None 

    @hashtags_as_list.setter 
    def hashtags_as_list(self, value): 
     """ Hashtags are stored on DB as a text json of the list object 
     """ 
     self.hashtags = json.dumps(value) 

class SomeModelSerializer(serializers.ModelSerializer): 
    hashtags = serializers.ListField(
     source='hashtags_as_list', 
     default = [], 
     required = False, 
     child = serializers.CharField(min_length=3, max_length=32, required=False) 
    ) 

當我穿上可瀏覽API,檢查查詢發送哈希標籤空白,我只得到錯誤。

------WebKitFormBoundary4L5MFBPrRA0QDqFL 
Content-Disposition: form-data; name="hashtags" 


------WebKitFormBoundary4L5MFBPrRA0QDqFL 

和錯誤如下:

{ 
    "hashtags": [ 
     "This field may not be blank." 
    ] 
} 
+0

你會得到什麼錯誤? –

+0

你試過添加'required = False'嗎? [文檔](http://www.django-rest-framework.org/api-guide/fields/#required)以供參考。 – Hevlastka

+0

我已將錯誤添加到答案中,還需要= False,它什麼都不做。 – Chemary

回答

0

您要發送的hashtags後的數據只是沒有這就是爲什麼DRF返回了錯誤信息的內容。您可以修復使用:

hashtags = serializers.ListField(required=False, child=CharField(allow_blank=True, ...), ...) 

但是請注意,您可能需要調整一些代碼來處理的時候hashtags將規範化爲空字符串。

+0

我得到'TypeError:__init __()得到了一個意外的關鍵字參數'allow_blank',我使用相當新的DRF3.2.3 – Chemary

+0

哦。 Jus看了一下代碼。 'ListField'直接將'Field'直接與支持'allow_blank'字段的'CharField'相比較。 – miki725

+0

已更新的答案。現在就試試。只需將'allow_blank = True'移動到子定義。這應該工作或給你另一個錯誤。我現在無法測試,所以不知道確切。 – miki725

相關問題