DRF - 如何根据条件更改 serializer.PrimaryKeyRelatedField 的过滤器查找键?
DRF - How to change serializer.PrimaryKeyRelatedField's filter lookup key with condition?
我正在尝试根据序列化程序上的其他布尔字段更改 serializers.PrimaryKeyRelatedField
的过滤器查找键,但我未能成功。 PrimaryKeyRelatedField 默认按 pk
键过滤。在某些情况下(如果序列化器上的 condition
字段发送为 True
),我只想用相关模型字段上的另一个字段更改该过滤键,例如 remote_id
.
class SomeSerializer(serializers.Serializer):
condition = serializers.BooleanField(default=False)
model_pks = serializer.PrimaryKeyRelatedField(queryset=Model.objects.all(), many=True)
到目前为止,我试图创建继承自 PrimaryKeyRelatedField
的新字段并覆盖 get_queryset
方法(不确定是否覆盖正确的方法),但我无法访问 condition
和 model_pks
字段值。
class CustomPrimaryKeyRelatedField(PrimaryKeyRelatedField):
def get_queryset(self):
queryset = self.queryset
# model_pks = sent model_pks
if condition:
return queryset.filter(remote_id__in=model_pks)
return queryset.filter(id__in=model_pks)
此外,我尝试使用 SerializerMethodField
而不是 PrimaryKeyRelatedField
之类的;
class SomeSerializer(serializers.Serializer):
condition = serializers.BooleanField(default=False)
model_pks = serializer.SerializerMethodField()
def get_model_pks(self, value):
pks = self.initial_data.get('model_pks', [])
if value.get('condition', False):
return Model.objects.filter(remote_id__in=pks)
return Model.objects.filter(pk__in=pks)
它提供了基于 condition
的更改查找键,但这次我无法使用 serializer.validated_data
.
访问 model_pks
值
有什么方法可以使用 PrimaryKeyRelatedField
进行条件查找键过滤吗?
我终于通过创建自定义主键字段成功解决了我自己的问题。在这个自定义字段上,我刚刚重新创建了 to_internal_value
方法并使用 self.root
.
访问了 condition
值
class CustomPrimaryKeyRelatedField(PrimaryKeyRelatedField):
def to_internal_value(self, data):
condition = self.root.initial_data.get('condition', False)
if self.pk_field is not None:
data = self.pk_field.to_internal_value(data)
try:
if condition:
return self.get_queryset().get(remote_id=data)
else:
return self.get_queryset().get(pk=data)
except ObjectDoesNotExist:
self.fail('does_not_exist', pk_value=data)
except (TypeError, ValueError):
self.fail('incorrect_type', data_type=type(data).__name__)
我不确定这是处理此类问题的最佳方式。但它暂时解决了我的问题。
我正在尝试根据序列化程序上的其他布尔字段更改 serializers.PrimaryKeyRelatedField
的过滤器查找键,但我未能成功。 PrimaryKeyRelatedField 默认按 pk
键过滤。在某些情况下(如果序列化器上的 condition
字段发送为 True
),我只想用相关模型字段上的另一个字段更改该过滤键,例如 remote_id
.
class SomeSerializer(serializers.Serializer):
condition = serializers.BooleanField(default=False)
model_pks = serializer.PrimaryKeyRelatedField(queryset=Model.objects.all(), many=True)
到目前为止,我试图创建继承自 PrimaryKeyRelatedField
的新字段并覆盖 get_queryset
方法(不确定是否覆盖正确的方法),但我无法访问 condition
和 model_pks
字段值。
class CustomPrimaryKeyRelatedField(PrimaryKeyRelatedField):
def get_queryset(self):
queryset = self.queryset
# model_pks = sent model_pks
if condition:
return queryset.filter(remote_id__in=model_pks)
return queryset.filter(id__in=model_pks)
此外,我尝试使用 SerializerMethodField
而不是 PrimaryKeyRelatedField
之类的;
class SomeSerializer(serializers.Serializer):
condition = serializers.BooleanField(default=False)
model_pks = serializer.SerializerMethodField()
def get_model_pks(self, value):
pks = self.initial_data.get('model_pks', [])
if value.get('condition', False):
return Model.objects.filter(remote_id__in=pks)
return Model.objects.filter(pk__in=pks)
它提供了基于 condition
的更改查找键,但这次我无法使用 serializer.validated_data
.
model_pks
值
有什么方法可以使用 PrimaryKeyRelatedField
进行条件查找键过滤吗?
我终于通过创建自定义主键字段成功解决了我自己的问题。在这个自定义字段上,我刚刚重新创建了 to_internal_value
方法并使用 self.root
.
condition
值
class CustomPrimaryKeyRelatedField(PrimaryKeyRelatedField):
def to_internal_value(self, data):
condition = self.root.initial_data.get('condition', False)
if self.pk_field is not None:
data = self.pk_field.to_internal_value(data)
try:
if condition:
return self.get_queryset().get(remote_id=data)
else:
return self.get_queryset().get(pk=data)
except ObjectDoesNotExist:
self.fail('does_not_exist', pk_value=data)
except (TypeError, ValueError):
self.fail('incorrect_type', data_type=type(data).__name__)
我不确定这是处理此类问题的最佳方式。但它暂时解决了我的问题。