Как добавить дополнительный ключ в созданный объект в Django Rest Framework?

Я новичок в Django

В настоящее время я пытаюсь добавить простой дополнительный ключ к моему возвращаемому 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}

Как видите, я не хочу возвращать только событие, но хочу добавить подписанный url.

Это дало мне ошибку: 'Events' object is not a mapping

Так как же мне добавить дополнительный ключ? Что я возвращаю в функции create? Могу ли я создать Response() в качестве возврата функции create в DRF?

Метод .create() сериализаторов должен возвращать экземпляр, который был создан. После успешного создания он используется в качестве экземпляра для сериализатора при обращении к serializer.data (Например, как он используется в retrieve 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

Есть и другие способы сделать это. Но тот, что приведен выше, может сделать это на основе предоставленного кода.

Вернуться на верх