簡體   English   中英

Django-REST Serializer:Queryset不過濾PrimaryKeyRelatedField結果

[英]Django-REST Serializer: Queryset does not filter PrimaryKeyRelatedField results

所以我有一個看起來像這樣的序列化器

class BuildingsSerializer(serializers.ModelSerializer):
    masterlisting_set = serializers.PrimaryKeyRelatedField(many=True, 
                                    queryset=Masterlistings.objects.all())

它很棒

serializer = BuildingsSerializer(Buildings.objects.get(pk=1))
serializer.data 

產生

OrderedDict([
    ("masterlistings_set", [
        "0a06e3d7-87b7-4526-a877-c10f54fa5bc9",
        "343643ac-681f-4597-b8f5-ff7e5be65eef",
        "449a3ad2-c76c-4cb8-bb86-1be72fafcf64",
    ])
])

但是,如果我將序列化程序中的查詢集更改為

class BuildingsSerializer(serializers.ModelSerializer):
     masterlistings_set = serializers.PrimaryKeyRelatedField(many=True, queryset=[])

我仍然得到相同的結果。

 OrderedDict([
    ("masterlistings_set", [
        "0a06e3d7-87b7-4526-a877-c10f54fa5bc9",
        "343643ac-681f-4597-b8f5-ff7e5be65eef",
        "449a3ad2-c76c-4cb8-bb86-1be72fafcf64",
    ])
])

這應該發生嗎? 我錯誤地使用了查詢集嗎? 我用[]作為一個簡單的例子來表明無論我什么都沒有變化。

請有任何見解是非常寶貴的

應該注意的是,主列表具有指向建築物的主鍵關系。 所以一個主人名單屬於一個建築物。

正如@zymud所指出的,PrimaryKeyRelatedField中的queryset參數用於驗證字段輸入以創建新條目。 過濾masterlistings_set的另一個解決方案是使用serializers.SerializerMethodField(),如下所示:

class BuildingsSerializer(serializers.ModelSerializer):
    masterlisting_set = serializers.SerializerMethodField()

    def get_masterlisting_set(self, obj):
        return MasterListing.objects.filter(building=obj).values_list('pk',flat=True)

相關字段中的queryset僅限制可接受的值。 因此,使用queryset=[]您將無法向masterlisting_set添加新值或創建新Buildings

UPDATE。 如何使用queryset進行過濾

這是一個小雙棘手-你需要重寫ManyRelatedFieldmany_init方法在RelatedField

# re-define ManyRelatedField `to_representation` method to filter values
# based on queryset
class FilteredManyRelatedField(serializers.ManyRelatedField):
    def to_representation(self, iterable):
        iterable = self.child_relation.queryset.filter(
            pk__in=[value.pk for value in iterable])
        return super(FilteredManyRelatedField, self).to_representation(iterable)


# use overridden FilteredManyRelatedField in `many_init`
class FilteredPrimaryKeyRelatedField(serializers.PrimaryKeyRelatedField):
    @classmethod
    def many_init(cls, *args, **kwargs):
        kwargs['child_relation'] = cls(queryset=kwargs.pop('queryset'))
        return FilteredManyRelatedField(*args, **kwargs)

暫無
暫無

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

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