如何在Django Rest框架中搜索列表中具有特定值的查询集 我想做什么
获取列表中具有特定值的所有查询集,该列表为如何在Django Rest框架中搜索列表中具有特定值的查询集 我想做什么,django,filter,django-rest-framework,Django,Filter,Django Rest Framework,获取列表中具有特定值的所有查询集,该列表为ManyToManyField 简而言之,如果我键入http://localhost:8000/api/pickup/?choosingUser=5,我想获得所有匹配的choosingUser=5拾取位置choosingUser来自ManyToManyField,因此picku\u-Places模型类似于choosingUser=[2,3,5,7] 问题 我无法通过列表中的特定值搜索查询集 当我键入http://localhost:8000/api/pi
ManyToManyField
简而言之,如果我键入http://localhost:8000/api/pickup/?choosingUser=5
,我想获得所有匹配的choosingUser=5
拾取位置choosingUser
来自ManyToManyField
,因此picku\u-Places
模型类似于choosingUser=[2,3,5,7]
问题
我无法通过列表中的特定值搜索查询集
当我键入http://localhost:8000/api/pickup/?choosingUser=5
,我得到所有查询集,其中包括那些没有choosingUser=5
的查询集
我正在使用django_过滤器
来过滤查询集。我阅读了文档,但找不到如何通过列表中的值获取查询集
如果可以的话,你能告诉我怎么做吗
多谢各位
======================================================
我的代码是这样的
models.py
class PickUp_Places(models.Model):
name = models.CharField(max_length=200, unique=True)
choosing_user = models.ManyToManyField(
settings.AUTH_USER_MODEL, related_name="pick_up")
def __str__(self):
return self.name
class Meta:
db_table = "pickup_places"
序列化程序.py
class PickUp_PlacesSerializer(serializers.ModelSerializer):
class Meta:
model = PickUp_Places
fields = "__all__"
views.py
class PickUp_PlacesViewSet(viewsets.ModelViewSet):
queryset = PickUp_Places.objects.all()
permission_classes = [
permissions.IsAuthenticatedOrReadOnly
]
serializer_class = PickUp_PlacesSerializer
filter_backends = [filters.DjangoFilterBackend]
filterset_fields = "__all__"
要从
url
overrideget\u queryset
方法获取choosingUser
:
def get_queryset(self):
choosingUser = self.request.query_params.get('choosingUser')
queryset = choosingUser is not None and PickUp_Places.objects.filter(choosing_user__id=choosingUser) or PickUp_Places.objects.all()
return queryset
详细版本:
def get_queryset(self):
choosingUser = self.request.query_params.get('choosingUser')
if choosingUser is not None:
queryset = PickUp_Places.objects.filter(choosing_user__id=choosingUser)
else:
queryset = PickUp_Places.objects.all()
return queryset
基于M2M字段添加过滤器的一种方法是将
filter\u字段
添加到视图集中,类似于:
class PickUp_PlacesViewSet(viewsets.ModelViewSet):
queryset = PickUp_Places.objects.all()
permission_classes = [
permissions.IsAuthenticatedOrReadOnly
]
serializer_class = PickUp_PlacesSerializer
filter_backends = [filters.DjangoFilterBackend]
filter_fields = ('choosing_user', )
然后使用http://localhost:8000/api/pickup/?choosing_user=5
当选择user时,它将返回用户id为5的所有位置。
如果要基于多个选择用户进行筛选,可以执行以下操作:
class PickUp_PlacesViewSet(viewsets.ModelViewSet):
queryset = PickUp_Places.objects.all()
permission_classes = [
permissions.IsAuthenticatedOrReadOnly
]
serializer_class = PickUp_PlacesSerializer
filter_backends = [filters.DjangoFilterBackend]
filter_fields = {
'choosing_user__id': ['in',]
}
并使用http://localhost:8000/api/pickup/?choosing_user=5,1,2
来过滤多个ID。谢谢你教我这个。现在它运行良好,我只能得到具有特定值的picku\u Place
模型。但是,http://localhost:8000/api/pickup
这是一个用于获取所有皮卡位置的url
模型不起作用。。。为什么会发生这种情况?@Toshi023Yuki这是因为choosingUser
在该url中是None
。现在,我已经更新了我的回答plz评论,如果您在理解上有任何问题,请告诉我。谢谢您的回复。一切正常。多亏了你,我才知道我想要什么。你是救命恩人!非常感谢。谢谢你的评论。我试过你教我的,但没用。