Django-REST Serializer:Queryset不过滤PrimaryKeyRelatedField结果

Cha*_*aro 9 python django serialization django-rest-framework

所以我有一个看起来像这样的序列化器

class BuildingsSerializer(serializers.ModelSerializer):
    masterlisting_set = serializers.PrimaryKeyRelatedField(many=True, 
                                    queryset=Masterlistings.objects.all())
Run Code Online (Sandbox Code Playgroud)

它很棒

serializer = BuildingsSerializer(Buildings.objects.get(pk=1))
serializer.data 
Run Code Online (Sandbox Code Playgroud)

产生

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

但是,如果我将序列化程序中的查询集更改为

class BuildingsSerializer(serializers.ModelSerializer):
     masterlistings_set = serializers.PrimaryKeyRelatedField(many=True, queryset=[])
Run Code Online (Sandbox Code Playgroud)

我仍然得到相同的结果.

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

这应该发生吗?我错误地使用了查询集吗?我用[]作为一个简单的例子来表明,无论我什么都没有改变.

请有任何见解是非常宝贵的

应该注意的是,主列表具有指向建筑物的主键关系.所以一个主人名单属于一个建筑物.

Ami*_*wal 8

正如@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)
Run Code Online (Sandbox Code Playgroud)