[英]Add custom field to ModelSerializer and fill it in post save signal
在我的API中,我有一條添加名為Video的資源的途徑。 我對此模型有一個post_save信號,在該信號中處理此視頻並生成一個字符串。 我希望序列化程序中的自定義字段能夠用生成的文本填充它。 因此,在我的回應中,我可以擁有這個價值。
class VideoSerializer(serializers.ModelSerializer):
class Meta:
model = Video
fields = ('id', 'owner', 'description', 'file')
@receiver(post_save, sender=Video)
def encode_video(sender, instance=None, created=False, **kwargs):
string_generated = do_stuff()
現在,我得到的答復是:
{
"id": 17,
"owner": "b424bc3c-5792-470f-bac4-bab92e906b92",
"description": "",
"file": "https://z.s3.amazonaws.com/videos/sample.mkv"
}
我希望新的鍵“字符串”具有信號生成的值。
為了在響應中附加string_generated
,您需要能夠從序列化器訪問該字段。 有兩種方便的方法可以做到這一點:
string_generated
作為字段,並在VideoSerializer
中將其添加為SerializerMethodField
以便string_generated
將是只讀值。 這意味着它將僅作為響應出現。 最后刪除您的發布信號並改寫save()方法: class VideoSerializer(serializers.ModelSerializer):
string_generated = serializers.SerializerMethodField(source='get_string_generated')
class Meta:
model = Video
fields = ('id', 'owner', 'description', 'file')
read_only_fields = ('string_generated')
def get_string_generated(self, obj):
return obj.string_generated
# models.py
class Video(models.Model):
# your fields...
def save(self, force_insert=False, force_update=False):
string_generated = do_stuff()
super(Video, self).save(force_insert, force_update)
VideoSerializer
中將do_stuff
添加為SerializerMethodField
: class VideoSerializer(serializers.ModelSerializer):
string_generated = serializers.SerializerMethodField()
class Meta:
model = Video
fields = ('id', 'owner', 'description', 'file')
def get_string_generated(self, obj):
return do_stuff()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.