根据ContentType和object_id列出模型。 (如何列出Generic ForeignKey对象)

时间:2017-09-27 08:35:03

标签: django django-models django-forms django-rest-framework django-views

到目前为止,这是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,因此其引用对象是“Outfit”。为了更好地理解,我提供了Star模型。它包含ContentType和object_id字段。它使用两个字段来引用 Generic foreignKey。

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()

这是Serializer和View

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

content_type 26和15都有每个图像字段(称为outfit_imgcloth_img)。要实现这一点,我想要使用不同的序列化程序在content_type

例如,如果content_type为26,则调用OutfitListSerializer。如果content_type为15,则调用ClothListSerializer。

我正在通过此链接(def create_comment_serializer)帮助构建此Star应用。 (https://github.com/codingforentrepreneurs/Blog-API-with-Django-Rest-Framework/blob/master/src/comments/api/serializers.py)。

非常感谢你!

1 个答案:

答案 0 :(得分:1)

如果我了解你,可能会使用serializermethodfield 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