簡體   English   中英

Django REST Framework:如何用空字符串替換 null?

[英]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 替換為這樣的空字符串 ""

AttendanceSerializerto_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

更新 (11/03/2019)

我有很多字段,我對所有字段重復此代碼並不是一個好主意,難道沒有更好的方法可以對所有字段執行此操作嗎?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM