Django Rest Framework,按名称过滤

vbopmzt1  于 2023-05-01  发布在  Go
关注(0)|答案(1)|浏览(149)

我试图通过用户名创建一个过滤器,但是django nonstop需要我的id。这里的修复是什么?

class FavoriteList(generics.ListCreateAPIView):
    permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsCurrentUserOwnerOrHidden]
    queryset = Favorite.objects.all()
    serializer_class = FavoritesSerializer
    name = 'favorite-list'

def perform_create(self, serializer):
    serializer.save(owner=self.request.user)

def filter_queryset(self, queryset):
    owner_name = self.request.query_params.get('owner', None)
    if owner_name is not None:
        queryset = queryset.filter(owner=owner_name)
    return queryset

localhost/favorite?owner=1正在工作,但loclahost/favorite?所有者=管理员不要

46scxncf

46scxncf1#

它是这样工作的,因为ForeignKey.filter方法按id搜索。要按username字段搜索,您必须使用正确的查找:

queryset.filter(owner__username=owner_name)

你可以分开这些值,或者我可能建议聪明的try/except:

def filter_queryset(self, queryset):
    owner_name = self.request.query_params.get('owner', None)
    if owner_name is not None:

        try:
            owner_id = int(owner_name)
        except ValueError:
            owner_id = None

        if owner_id:
            queryset = queryset.filter(owner=owner_id)
        else:
            queryset = queryset.filter(owner__username=owner_name)

    return queryset

使用上面的解决方案,您可以将对象的id或username属性作为GET参数传递。

相关问题