gpt4 book ai didi

Django REST Framework ManyToMany 过滤多个值

转载 作者:行者123 更新时间:2023-12-04 11:48:55 27 4
gpt4 key购买 nike

我有两个模型,一个定义用户,另一个定义这些用户的标签。我正在使用 Django REST 框架来创建 API。我希望能够查询至少包含标签 ID 1 和 2 的用户。
例如,如果用户的标签是:[(1,2), (1,2,3), (2,3), (1,3)]我希望查询返回[(1,2), (1,2,3)] .
到目前为止,我已经设法通过执行以下操作来查询具有给定标签(假设 id=1)的用户:/api/users/?labels=1 ,但我无法查询标签为 1 和 2 的用户。我试过 /api/users/?labels=1,2/api/users/?labels=1&labels=2但它返回一些无效用户,即没有标签 1 或 2 的用户......
Github 测试仓库:
https://github.com/TheDimLebowski/drf-m2m-filter
代码:
模型.py

class Label(models.Model):
name = models.CharField(max_length = 60)

class User(models.Model):
labels = models.ManyToManyField(Label)
过滤器.py
class UserFilter(django_filters.FilterSet):
labels = django_filters.filters.BaseInFilter(
name='labels',
lookup_type='in',
)

class Meta:
model = User
fields = ('labels',)
序列化程序.py
class LabelSerializer(serializers.ModelSerializer):
class Meta:
model = Label
fields = ('id','name')

class UserSerializer(serializers.ModelSerializer):
labels = LabelSerializer(many = True)
class Meta:
model = User
fields = ('labels',)
View .py
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = (filters.DjangoFilterBackend,)
filter_class = UserFilter
filter_fields = ('labels',)

最佳答案

您可以链接过滤器。例如,如果您需要标签同时包含 1 的所有用户和 2值,您可以像这样编写查询:

User.objects.filter(labels=1).filter(labels=2)
django-filters默认情况下不支持这样的查询,因此您需要自定义过滤器。
class M2MFilter(django_filters.Filter):

def filter(self, qs, value):
if not value:
return qs

values = value.split(',')
for v in values:
qs = qs.filter(labels=v)
return qs


class UserFilter(django_filters.FilterSet):
labels = M2MFilter(name='labels')

class Meta:
model = User
fields = ('labels',)
现在您可以编写以逗号分隔的标签 id 并获得您所需要的
/api/users/?labels=1,2
Here is good answer about m2m queries

关于Django REST Framework ManyToMany 过滤多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39368410/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com