当前位置: 首页 > 知识库问答 >
问题:

根据ContentType和object_id列出模型。如何列出通用的ForeignKey对象

张鹏云
2023-03-14

到目前为止,这是StarListAPIView。

[
    {
        "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,所以它的引用对象是“装备”。为了更好地理解,我提供了StarModel。它包含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)。

非常感谢你!

共有1个答案

徐高懿
2023-03-14

如果我理解你,也许你可以使用序列化方法字段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
 类似资料:
  • 问题内容: 我有一个模型和,就像这样: 现在我有了一些和对象,我想得到一个查询,该查询选择所有指向少于2的对象。 A就像一个池子,用户(B)加入池。如果仅加入1或0,则根本不应该显示该池。 这样的模型设计可能吗?还是我应该修改一下? 问题答案: 听起来像是一份工作。 如果B计数通常是您需要的过滤或排序标准,或者需要显示在列表视图中,则可以考虑通过将b_count字段添加到A模型并在添加B或添加B时

  • 问题内容: 如何枚举所有导入的模块? 例如,我想从以下代码中获取: 问题答案: 仅获取当前模块的所有导入的一种近似方法是检查模块: 这不会返回本地导入或非模块导入(如)。请注意,这将返回,因此,如果您使用的话,将获得原始模块名称。如果要使用别名,则使用yield名称代替。

  • 问题内容: 说我这样创建一个对象: 检索属性名称列表的最佳方法是什么?即我想以一些变量“键”结束: 问题答案: 在现代浏览器(IE9 +,FF4 +,Chrome5 +,Opera12 +,Safari5+)中,您可以使用内置的Object.keys方法: 上面有完整的polyfill,但简化的版本是: 或者替换为,以允许您调用任何对象。扩展原型会产生一些副作用,我不建议您这样做。

  • 问题内容: 如何枚举所有导入的模块? 例如,我想从以下代码中获取: 问题答案: 仅获取当前模块的所有导入的一种近似方法是检查globals()模块: 这不会返回本地导入,也不会返回非模块导入,例如。请注意,这将返回,因此如果你使用的话,将获得原始模块名称;如果你想要别名,则使用名称。

  • 我要提前道歉——我知道这个问题可能已经在其他地方得到了解答,但是我似乎无法找到我需要的答案,也无法设法让我找到的其他代码适应我的需要。 我有一个数据框: 我想生成一个一个和两个之间COUNT值之差的数据帧,每个FILE都有一行,即。 我确信我应该能够相当容易地使用基础R或Plyr做到这一点,但我有点卡住了。任何人都可以建议一个好方法来做到这一点,也许在Plyr上有很好的教程,可能会帮助我解决将来的

  • 问题内容: 如何使entry.category成为CategoryProxy的实例?有关详细信息,请参见代码: 从Category转换为CategoryProxy也是可以的,但是我对ORM内部结构以正确复制内部状态不是很熟悉… 编辑。 原因:我向CategoryProxy添加了方法,并想使用他: 编辑2. 目前,我是这样实现的: 但是看起来很糟糕… 问题答案: 在不访问数据库的情况下从模型类切换到