我正在使用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是外键。
是否可以按我喜欢的方式过滤?如果不是为什么以及如何以更好的方式过滤我的选择?
答案 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')