如何在 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
还有其他方法可以做到。但是上面的可能会根据提供的代码来完成。
我是 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
还有其他方法可以做到。但是上面的可能会根据提供的代码来完成。