Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django rest framework 根据实例数据选择序列化程序字段_Django Rest Framework - Fatal编程技术网

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

Django rest framework 根据实例数据选择序列化程序字段,django-rest-framework,Django Rest Framework,我正试图根据实例本身动态地包括/排除ModelSerializer上的特定字段。因此,假设我有一个分层模型,它使用自连接表示地理: class TreeModel(): name = CharField() kind = CharField(choices=['country', 'state', 'city']) parent = ForeignKey(self, related_name='children') 考虑到这一点,假设我想隐藏一个实例的“儿童”关系链接,

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

class TreeModel():
    name = CharField()
    kind = CharField(choices=['country', 'state', 'city'])
    parent = ForeignKey(self, related_name='children')
考虑到这一点,假设我想隐藏一个实例的“儿童”关系链接,当该类是“国家”时,然后显示它。我试着摆弄
get\u字段
方法,但没有成功

我之所以希望这样做,是因为在我的模型中,TreeModel类的一些实例有数千个子类,而其他实例只有几个子类。我不想显示某些实例类型的子类,因为这会降低性能,我只需要它们的一个子集。Thnaks是您正在寻找的。 DRF允许您在序列化程序初始化时动态修改字段

class TreeSerializer:
    def __init__(self , instance , *args , **kwargs ):
        super().__init__(instance , *args , **kwargs)
        if instance.kind == 'state':
            self.fields.pop('children')
        #Other Conditions
此示例之所以成立,是因为序列化程序的第一个位置参数始终是模型实例

还有另一种不修改序列化程序的方法:使用。
这里我演示了如何使用它们

您想在检索请求或列表请求中使用它们吗?如果“检索”的意思是获取单个对象(细节视图vs.列表视图),那么是的,这正是我的意思。但是,给定我使用的序列化程序(JSONAPI),这也意味着列表视图中包含的每个对象通常都包含对每个字段的引用。(这不是一个嵌套序列化程序;我只是说,如果我请求一个“混合类型”列表,它仍然需要根据列表中的每个对象类型动态选择子字段。感谢您的回复,但不是这样(我应该先提到我阅读了文档。)您提到的部分演示了如何显式指定所请求的字段;我希望将字段列表指定为实例本身的函数。如果该答案显示了如何在类中访问实例,那么是的,它会工作。但它没有显示这一点。谢谢。我将接受它,因为它工作并回答了我提出的问题。事实证明,这并不能解决我的问题,但这是正交的。你能提供更多的细节和解释吗?
class TreeSerializer(serializers.ModelSerializer):
    def to_representation(self, instance):
        if instance.kind == 'state':
            self.fields.pop('children')
        return super().to_representation(instance)