如何在 Django Rest Framework 中创建的对象中添加额外的键?

How to add extra key in created object in Django Rest Framework?

我是 Django 新手

目前,我正在尝试在序列化程序中的 returned json 上添加一个简单的额外密钥。这是我的序列化程序的 create() 覆盖:

    def create(self, validated_data):
        available_dates = validated_data.pop("available_dates")

        # Default expiry time is 3 days
        expiry = datetime.datetime.now() + datetime.timedelta(days=3)
        event = Events.objects.create(**validated_data, expiry=expiry)
        for selectedTime in available_dates:
            AvailableDates.objects.create(
                event=event,
                **selectedTime,
            )

        signer = Signer()
        signedObject = signer.sign_object(
            {"expiry": expiry.isoformat(), "id": event.id}
        )

        return {**event, "signed_url": signedObject}

如您所见,我不想只 return 事件,但我想添加一个已签名的 url。

这给了我一个错误: 'Events' object is not a mapping

那么我该如何添加额外的密钥呢?我在 create 函数中 return 做什么?我可以创建 Response() 作为 DRF 中创建函数的 return 吗?

序列化程序的 .create() 方法需要 return 创建的实例。成功创建后,它在访问 serializer.data 时用作序列化程序的实例(就像它在检索 api 中的使用方式)


至于添加 signed_url,您可以将其添加到序列化程序的字段中,例如:

class EventSerializer(ModelSerializer):
   # other fields ...
   signed_url = SerializerMethodField()

   class Meta:
       model = Event
       fields = [
           # other fields ...
           "signed_url",
       ]

   def create(self, validated_data):
        available_dates = validated_data.pop("available_dates")

        # Default expiry time is 3 days
        expiry = datetime.datetime.now() + datetime.timedelta(days=3)
        event = Events.objects.create(**validated_data, expiry=expiry)
        for selectedTime in available_dates:
            AvailableDates.objects.create(
                event=event,
                **selectedTime,
            )

        signer = Signer()
        signedObject = signer.sign_object(
            {"expiry": expiry.isoformat(), "id": event.id}
        )
        event.signedObject = signedObject

        return event
    def get_signed_url(self,obj):
         if not hasattr(obj, "signedObject"):
             return None
         # you can add other code here if you need to do something else with signedObject
         return obj.signedObject

还有其他方法可以做到。但是上面的可能会根据提供的代码来完成。