簡體   English   中英

將自定義字段添加到ModelSerializer並填寫后保存信號

[英]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 ,您需要能夠從序列化器訪問該字段。 有兩種方便的方法可以做到這一點:

  1. 在您的模型中添加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)
  1. 如果可能,請刪除您的后信號。 然后,在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.

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