Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.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
Python DRF-如何更改serializer.PrimaryKeyRelatedField';带条件的筛选器查找键?_Python_Django_Django Rest Framework_Django Queryset_Django Serializer - Fatal编程技术网

Python DRF-如何更改serializer.PrimaryKeyRelatedField';带条件的筛选器查找键?

Python DRF-如何更改serializer.PrimaryKeyRelatedField';带条件的筛选器查找键?,python,django,django-rest-framework,django-queryset,django-serializer,Python,Django,Django Rest Framework,Django Queryset,Django Serializer,我正在尝试更改序列化程序。PrimaryKeyRelatedField的筛选器查找键基于序列化程序上的其他布尔字段,但未能成功。默认情况下,PrimaryKeyRelated字段按pk键过滤。在某些情况下(如果序列化程序上的条件字段作为True发送),我只想用相关模型字段上的另一个字段(如remote\u id)更改该筛选键 class SomeSerializer(serializers.Serializer): 条件=serializers.BooleanField(默认值=False) m

我正在尝试更改
序列化程序。PrimaryKeyRelatedField
的筛选器查找键基于序列化程序上的其他布尔字段,但未能成功。默认情况下,PrimaryKeyRelated字段按
pk
键过滤。在某些情况下(如果序列化程序上的
条件
字段作为
True
发送),我只想用相关模型字段上的另一个字段(如
remote\u id
)更改该筛选键

class SomeSerializer(serializers.Serializer):
条件=serializers.BooleanField(默认值=False)
model_pks=serializer.PrimaryKeyRelatedField(queryset=model.objects.all(),many=True)
到目前为止,我试图创建从
PrimaryKeyRelatedField
继承的新字段,并重写
get\u queryset
方法(不确定是否重写正确的方法),但我无法访问
condition
model\u pks
字段值

类CustomPrimaryKeyRelatedField(PrimaryKeyRelatedField):
def get_queryset(自我):
queryset=self.queryset
#型号\包装=已发送型号\包装
如果条件:
返回queryset.filter(远程\u id\u in=model\u pks)
返回queryset.filter(id\uu in=model\u pks)
此外,我尝试使用
SerializerMethodField
而不是
PrimaryKeyRelatedField

class SomeSerializer(serializers.Serializer):
条件=serializers.BooleanField(默认值=False)
model_pks=serializer.SerializerMethodField()
def get_model_pks(自身、价值):
pks=self.initial\u data.get('model\u pks',[])
if value.get('condition',False):
返回Model.objects.filter(远程\u id\u in=pks)
返回Model.objects.filter(pk\uu in=pks)
它提供了基于
条件更改查找键的功能,但这次我无法使用
序列化程序访问
模型\u pks
值。已验证的\u数据


是否有任何方法可以使用
PrimaryKeyRelatedField
进行条件查找关键字筛选?

我终于成功地解决了自己的问题,创建了自定义的主键字段。在这个自定义字段上,我刚刚重新创建了
to_internal_value
方法,并使用
self.root
访问了
条件

类CustomPrimaryKeyRelatedField(PrimaryKeyRelatedField):
def至_内部_值(自身、数据):
condition=self.root.initial\u data.get('condition',False)
如果self.pk_字段不是无:
数据=自.pk\u字段到\u内部\u值(数据)
尝试:
如果条件:
返回self.get\u queryset().get(远程\u id=data)
其他:
返回self.get_queryset().get(pk=data)
除ObjectDoesNotExist外:
self.fail('不存在',主键值=数据)
除了(TypeError、ValueError):
self.fail('不正确的类型',数据类型=类型(数据)。\名称\uuuuuu)

我不确定这是否是处理此类问题的最佳方式。但它现在解决了我的问题。

但是,这只是针对post请求权限,因为我试图筛选与主键相关的字段,并在可浏览的API页面中仅显示其相关对象,并且面临一些问题。为什么你没有实现
到_表示
@manishah是的。此序列化程序仅用于post请求,因此我们不会对to_表示方法采取任何操作。