[英]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進行過濾
這是一個小雙棘手-你需要重寫ManyRelatedField
和many_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.