Chr*_*ian 5 python arrays integer django-rest-framework typescript
我需要将整数数组发送到 DRF 序列化器。
序列化器是:
class ItemSerializer(serializers.Serializer):
id = serializers.IntegerField(required = False)
selected_items = serializers.ListField(child = serializers.IntegerField())
Run Code Online (Sandbox Code Playgroud)
在 FE 中,我只需通过打字稿发布一个数组:
createItem () {
let tmp: any = {};
const itemData = new FormData();
itemData.append('id',1);
itemData.append('selected_items', this.current.selected_items.map( e => e.id))
return this.itemService.createItem( itemData )
.subscribe( data => this.goBack( data ),
err => {
console.log( err );
this.toastr.error( 'Item not saved', 'Error' )
} );
}
Run Code Online (Sandbox Code Playgroud)
itemService.createItem只做一个http.post
当 FE 发送数据到 BE 时,selected_items 字段被编码为selected_items=1,2(通过wireshark验证)。当从 DRF 解析数据时,该字段被编码为selected_items=['1,2']. 因此该字段未经过验证,因为 1,2 不是有效整数。
如果您在请求中获取逗号分隔值,那么您可能需要在进行验证之前将其转换为实际列表。
只需重写to_internal_value()序列化器中的方法即可转换值。
class ItemSerializer(serializers.Serializer):
id = serializers.IntegerField(required = False)
selected_items = serializers.ListField(child = serializers.IntegerField())
def to_internal_value(self, data):
"""
method is called to restore a primitive datatype into its internal python representation. This method should raise a serializers.ValidationError if the data is invalid.
reference: https://www.django-rest-framework.org/api-guide/fields/#custom-fields
"""
# Convert comma separated digits to list of integers
data['selected_items'] = data['selected_items'].split(',') if data['selected_items'] else []
return data
Run Code Online (Sandbox Code Playgroud)
否则,您可以编写自定义字段级验证:
class ItemSerializer(serializers.Serializer):
id = serializers.IntegerField(required = False)
selected_items = serializers.ListField(child = serializers.IntegerField())
def validate_selected_items(self, value):
"""
You can specify custom field-level validation by adding .validate_<field_name> methods to your Serializer subclass.
reference: https://www.django-rest-framework.org/api-guide/serializers/#field-level-validation
"""
# Convert comma separated digits to list of integers
return value.split(',') if value else []
Run Code Online (Sandbox Code Playgroud)