在Rest Framework

时间:2017-04-26 10:11:48

标签: django django-rest-framework many-to-many

我正在使用Django REST Framwork并遇到了Browsable api的一些问题。我无法过滤ManyToMany字段,因此它只显示用户所有者的对象。 我设法过滤用户并过滤掉自己的对象。

在序列化器中我有

class BidSerializer(serializers.HyperlinkedModelSerializer):
        id = serializers.HyperlinkedRelatedField(view_name='bid-detail', read_only=True)

    def __init__(self, *args, **kwargs):
        super(BidSerializer, self).__init__(*args, **kwargs)
        request_user = self.context['request'].user
        self.fields['my_items'].queryset  = Item.objects.filter(owner=request_user)
        print(self.fields['my_items'].queryset)
        self.fields['others_items'].queryset = Item.objects.exclude(owner=request_user)
        self.fields['user'].queryset = User.objects.filter(username=request_user)

    class Meta:
        model = Bid
        fields = ('id','comment','user','others_items','my_items','timestamp')

奇怪的是,字段'user'和'others_items'按照假设进行过滤。虽然'my_items'未经过滤,但显示所有项目。但是,包含print语句的行显示正确的输出。字段之间的区别在于my_items是ManyToMany字段而others_items是外键。

是否可以按我喜欢的方式过滤?如果不是为什么以及如何以更好的方式过滤我的选择?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,并在调试器中检查了我的多对多字段之一后,我发现了多对多字段中的child_relation属性,该属性具有queryset属性。在查询集前面添加child_relation属性对我来说很有效。

我还使用了Django Rest Framework的3.8.2版本。

示例:

class BidSerializer(serializers.HyperlinkedModelSerializer):
    id = serializers.HyperlinkedRelatedField(view_name='bid-detail', read_only=True)

    def __init__(self, *args, **kwargs):
        super(BidSerializer, self).__init__(*args, **kwargs)
        request_user = self.context['request'].user
        self.fields['my_items'].child_relation.queryset = Item.objects.filter(owner=request_user)
        self.fields['others_items'].child_relation.queryset = Item.objects.exclude(owner=request_user)
        self.fields['user'].queryset = User.objects.filter(username=request_user)

    class Meta:
        model = Bid
        fields = ('id', 'comment', 'user', 'others_items', 'my_items', 'timestamp')