我有一个序列化程序和一个与通用外键关系相关的字段
应该用于序列化content_object
实例的ContentType
。我需要检查要在相关字段中序列化的type
对象的Notification
,以正确知道要在其中序列化为data
参数的其他字段。实现此目标的最佳方法是什么?
class NotificationRelatedField(serializers.RelatedField):
def to_representation(self, value):
data = {}
# Need to check notification 'type' here
return data
class NotificationRetrieveSerializer(serializers.ModelSerializer):
content_object = NotificationRelatedField(read_only=True)
class Meta:
model = Notification
fields = [
'id',
'created_at',
'is_read',
'type',
'content_object',
]
答案 0 :(得分:1)
您需要重写序列化程序的=
方法,以使用to_representation
实例而不是字段的值来调用字段的to_representation
方法。
示例:
Notification
答案 1 :(得分:1)
您可以使用SerializerMethodField
作为序列化通用FK关系,
class Content_Model_1_serializer(serializers.ModelSerializer):
# you code
class Content_Model_2_serializer(serializers.ModelSerializer):
# your code
class NotificationRetrieveSerializer(serializers.ModelSerializer):
content_object = serializers.SerializerMethodField(read_only=True)
def get_content_object(self, notification):
if isinstance(notification.content_object, Content_Model_1):
return Content_Model_1_serializer(notification.content_object).data
if isinstance(notification.content_object, Content_Model_2):
return Content_Model_2_serializer(notification.content_object).data
## and so on
return None # default case
class Meta:
model = Notification
fields = [
'id',
'created_at',
'is_read',
'type',
'content_object',
]
Content_Model_1
和Content_Model_2
是通过通用FK关系关联的模型,而Content_Model_1_serializer
和Content_Model_2_serializer
是序列化程序。