Как добавить дополнительный ключ в созданный объект в 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
Есть и другие способы сделать это. Но тот, что приведен выше, может сделать это на основе предоставленного кода.