到目前为止,这是Star
ListAPIView。
[
{
"user": 1,
"content_type": 26,
"object_id": 7
},
{
"user": 1,
"content_type": 26,
"object_id": 8
},
{
"user": 1,
"content_type": 15,
"object_id": 5
},
{
"user": 1,
"content_type": 15,
"object_id": 6
}
]
因为数组中第一个对象的content_type是26,所以它的引用对象是“装备”。为了更好地理解,我提供了Star
Model。它包含ContentType和object_id字段。它使用两个字段来引用通用外键。
class Star(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
objects = StarManager()
这里是序列化程序和视图
serializers.py
class ListStarSerializer(serializers.ModelSerializer):
class Meta:
model = Star
fields = ('user', 'content_type', 'object_id')
views.py
class StarListAPIView(generics.ListAPIView):
serializer_class = ListStarSerializer
def get_queryset(self):
qs = Star.objects.filter(user=self.request.user)
return qs
内容类型26和15都有各自的图像字段(分别称为服装img
和布料img
)。为了实现这一点,我想根据内容类型使用不同的序列化程序
例如,如果内容类型为26,则调用OutfightListSerializer。如果content_type为15,则调用ClothListSerializer。
我正在构建这个Star
应用程序有这个链接的帮助(defcreate_comment_serializer)。(https://github.com/codingforentrepreneurs/Blog-API-with-Django-Rest-Framework/blob/master/src/comments/api/serializers.py)。
非常感谢你!
如果我理解你,也许你可以使用序列化方法字段serializers.py
class ListStarSerializer(serializers.ModelSerializer):
img_data = serializers.SerializerMethodField()
class Meta:
model = Star
fields = ('user', 'content_type', 'object_id')
def get_img_data(self, obj):
if obj.content_type_id == 15:
serializer = ClothListSerializer(obj.content_object)
elif obj.content_type_id == 26:
serializer = OutfitListSerializer(obj.content_object)
else:
return {}
return serializer.data