【问题标题】:Django Rest framework serializer exclude foreign key with depth 2Django Rest框架序列化程序排除深度为2的外键
【发布时间】:2012-09-04 10:52:52
【问题描述】:

我制作了一个将对象作为 json 数据返回的 api。我正在使用 django-rest-framework 及其序列化程序。使用资源 (ModelResource) 我排除了一些字段,例如名为“所有者”的属性。其中一个字段是其自身的外键。我想在 api 中显示这个字段(所以我使用 depth=2),但我想排除与我在返回对象中排除的字段相同的字段。 有没有很好的方法来做到这一点(我已经尝试了几件事但没有想要的结果)。

这是我的(简化的)代码: 在models.py中:

class MyObject(models.Model):
    name = models.CharField(max_length=256, blank=True)
    parent = models.ForeignKey('self',  blank=True,  null=True, default=None)
    and_some_otherfields = models.otherFields(....)
    owner = models.ForeignKey(User, null=True, blank=True, related_name='myobject_owner')

在resource.py中:

class MyObjectResource(ModelResource):
    model = MyObject
    exclude = ('owner','and some other fields',)

并在用于返回对象的视图中返回:

    data = Serializer(depth=2).serialize(my_object)
    return Response(status.HTTP_200_OK, data)

在响应中,它省略了排除字段(正如我想要和预期的那样)。

但在字段 parent 中,包含我要隐藏的所有字段的父 myobject。

我正在寻找一种方法来表明对于这个父对象,序列化程序应该使用相同的资源,或者将辅助字段添加到排除列表中......

如果我使用 depth =1,它只显示它是否有父级 ([]),如果没有,则显示 null,我确实需要至少知道父级的 ID。

【问题讨论】:

    标签: django django-rest-framework serialization


    【解决方案1】:

    啊,我刚刚找到了:

    我需要为所有要显示什么资源的字段添加资源......

    fields = ('name', ("parent","MyObjectResource") , '以及您想查看的所有其他字段...')

    我在这里找到它:google groups forum question

    您可以跳过排除,它会忽略它,只需添加您要显示的字段,您不必定义它们,除非您需要指明要使用的资源。

    所以下面是resource.py部分的最终代码:

    class MyObjectResource(ModelResource):
        model = MyObject
        fields = ('name', ("parent","MyObjectResource"), 'and all the other fields you want to see as well...')
    

    【讨论】:

    • 回答你自己的问题有点奇怪,但是因为我自己的问题的措辞,我想到了一个更好的搜索。我会把它留在这里,因为让这件事完全正常工作对我来说是一个难题(也是排除部分)......在 django-rest-framework 的文档和示例中还有很多工作要做,然而,一个出色的框架!
    【解决方案2】:

    下面是其他解决方案。

    class ProToPicturesSerial(serializers.ModelSerializer):
        pro_pictures = PictureSerializer(many=True)
        pro_videos = VideoSerializer(many=True)
        city_pro = CitySerializer(many=True)
    
        class Meta:
            model = Province
            fields = ('id', 'name', 'intro', 'description', 'display_url', 'pro_pictures', 'pro_videos', 'city_pro')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 2021-06-22
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      相关资源
      最近更新 更多