![](/img/trans.png)
[英]How to filter by not empty string in a Django Rest Framework request querysting?
[英]Django REST Framework: how to substitute null with empty string?
我有一個 ImageField 類型的模型如下:
class Attendance(models.Model):
face_image = models.ImageField(, blank=True, null=True, storage=MediaStorage())
基於模型的序列化器
class AttendanceSerializer(serializers.ModelSerializer):
class Meta:
model = Attendance
fields = ('id','face_image')
但是,如果圖像字段為空,則顯示如下
Its now showing like this in the json
{
"id": 1,
"face_image": null
}
如果 face_image (ImageField) 為 None,它將顯示一個輸出為 null。 我想要的是將 null 替換為這樣的空字符串 ""
將AttendanceSerializer
的to_representation()
方法重寫為,
class AttendanceSerializer(serializers.ModelSerializer):
class Meta:
model = Attendance
fields = ('id', 'face_image')
def to_representation(self, instance): data = super().to_representation(instance) if not data['face_image']: data['face_image'] = "" return data
我有很多字段,我對所有字段重復此代碼並不是一個好主意,難道沒有更好的方法可以對所有字段執行此操作嗎?
class AttendanceSerializer(serializers.ModelSerializer):
class Meta:
model = Attendance
fields = ('id', 'face_image')
def to_representation(self, instance):
my_fields = {'field_1', 'field_2', 'field_3', 'field_4', 'field_5'}
data = super().to_representation(instance)
for field in my_fields: try: if not data[field]: data[field] = "" except KeyError: pass
return data
您可以使用 SerializerMethodField。
class AttendanceSerializer(serializers.ModelSerializer):
face_image = serializers.SerializerMethodField()
class Meta:
model = Attendance
fields = ('id', 'face_image')
def get_face_image(self, instance):
return (instance.face_image.url if instance.face_image else '')
對 Serializer Meta 中提到的所有字段進行迭代的代碼:
def to_representation(self, instance):
data = super().to_representation(instance)
for key, value in data.items():
try:
if not value:
data[key] = ""
except KeyError:
pass
return data
要添加到 JPG 的答案中,這里有一個 mixin,它允許更輕松地to_representation
覆蓋to_representation
方法的邏輯。 它還確保這些值是None
而不僅僅是falsy 。
class ConvertNoneToStringSerializerMixin():
"""
Mixin to convert None to empty strings.
This must be added as the first inherited class. The property `Meta.none_to_str_fields` must
be defined in order for this to have any effect. This only applies to representations,
when we export our instance data, not when we acquire and validate data.
"""
def get_none_to_str_fields(self):
meta = getattr(self, 'Meta', None)
return getattr(meta, 'none_to_str_fields', [])
def to_representation(self, instance):
fields = self.get_none_to_str_fields()
data = super().to_representation(instance)
if not fields or not isinstance(data, dict):
return data
for field in fields:
if field in data and data[field] is None:
data[field] = ''
return data
這是你將如何使用它:
class AttendanceSerializer(ConvertNoneToStringSerializerMixin, serializers.ModelSerializer):
class Meta:
model = Attendance
fields = ('id', 'face_image')
none_to_str_fields = ('face_image', )
此外,對於那些想知道的人,我們不能覆蓋Field
本身的to_representation
方法,因為當值為None
時, Serializer
的核心實現將跳過從該字段調用to_representation
。 因此,覆蓋序列化程序是實現這一目標的唯一方法。
您可以自定義序列化器字段並將其用作 ImageField 的默認 ModelSerializer 字段映射。
注意:應該在序列化程序類之前加載以下代碼片段。
from rest_framework import serializers
from django.db import models
class MyImageField(serializers.ImageField):
def __init__(self, *args, **kwargs):
self.null_as_blank = kwargs.pop('null_as_blank', True)
if self.null_as_blank:
kwargs['allow_blank'] = True
super().__init__(*args, **kwargs)
def to_internal_value(self, data):
value = super().to_internal_value(data)
# Handle deserializer, change blank value back to null.
if self.null_as_blank and value == '':
value = None
return value
def to_representation(self, value):
value = super().to_internal_value(value)
if self.null_as_blank and value is None:
value = ''
return value
serializers.ModelSerializer.serializer_field_mapping[models.ImageField] = MyImageField
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.