如何使用 PrimaryKeyRelatedField 更新多对多关系上的类别

Gly*_*son 3 python django django-rest-framework

Django Rest Framework 有一个PrimaryKeyRelatedField,它列出了我与类别的关系的 ID many-to-many...

class CatalogueItemsSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='catalogue_item_detail')
    name = serializers.CharField(min_length=2, max_length=60)
    categories = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
Run Code Online (Sandbox Code Playgroud)

我想覆盖create()类别字段上获取大量发布的 ID(传统上 DRF 希望我发送 URL)。

JSON 帖子:

{
"name": "test",
"categories": [1,2]
}
Run Code Online (Sandbox Code Playgroud)

序列化器创建:

def create(self, validated_data):
    categories = validated_data.pop('categories', None)
    print(categories) # This shows and empty/None even when ID are posted!
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是categories上面是空的,我假设因为PrimaryKeyRelatedField设置为read_only=True,但根据 DRF,这必须为真。

我的问题是...如何使用PrimaryKeyRelatedFieldwithvalidated_data.pop来获取我提交的 ID 列表?

我可以使用self.context.get("request").data['categories'],但这很糟糕,需要我把它变成一个列表+其他东西。

Gly*_*son 6

对于遇到此问题的其他人,我找到了一个允许PrimaryKeyRelatedField读/写的解决方案。只需添加queryset

categories = serializers.PrimaryKeyRelatedField(many=True, queryset=Category.objects.all())
Run Code Online (Sandbox Code Playgroud)

它仍然会过滤正确的关系,这有点令人困惑。