根据实例数据选择序列化程序字段

时间:2017-03-23 19:48:47

标签: django-rest-framework

我正在尝试根据实例本身在我的ModelSerializer上动态包含/排除特定字段。所以,假设我有一个使用自连接表示地理的分层模型:

class TreeModel():
    name = CharField()
    kind = CharField(choices=['country', 'state', 'city'])
    parent = ForeignKey(self, related_name='children')

考虑到这一点,假设我想隐藏一个实例的'儿童'关系链接,当种类是'状态'时,然后在种类是'国家'时显示它。我尝试摆弄get_fields方法,但这不起作用。

我希望这样做,因为在我的模型中,TreeModel类的一些实例有数千个子节点,但其他实例只有少数几个。我不想为某些实例类型显示子代,因为它会破坏性能,我只需要它们用于子集。 Thnaks

2 个答案:

答案 0 :(得分:3)

This是您正在寻找的。 DRF允许您在序列化程序初始化时动态修改字段。

class TreeSerializer:
    def __init__(self , instance , *args , **kwargs ):
        super().__init__(instance , *args , **kwargs)
        if instance.kind == 'state':
            self.fields.pop('children')
        #Other Conditions

此示例将成立,因为序列化程序的第一个位置参数始终是模型实例。

在不修改序列化程序的情况下,还有另一种方法:使用Django signals。 这是我的answer演示了如何使用它们

答案 1 :(得分:0)

    # serivce name
    spring.application.name=student-service
    # port
    server.port=6161
    # eureka server url
    eureka.client.service-url.defaultZone=http://localhost:6969/eureka
    eureka.client.registerWithEureka=true
    eureka.client.fetchRegistry=true