簡體   English   中英

DRF - 如何使用條件更改 serializer.PrimaryKeyRelatedField 的過濾器查找鍵?

[英]DRF - How to change serializer.PrimaryKeyRelatedField's filter lookup key with condition?

我正在嘗試根據序列化程序上的其他 boolean 字段更改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方法(不確定是否覆蓋正確的方法),但我無法訪問conditionmodel_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__)

我不確定這是處理此類問題的最佳方法。 但它現在解決了我的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM