gpt4 book ai didi

Django Rest Framework 在 get_queryset 方法中过滤对象

转载 作者:行者123 更新时间:2023-12-04 07:45:40 24 4
gpt4 key购买 nike

基本上,我有一个目录 View 集。在 ListView 中,我想进行一些过滤并相应地返回。
相关的目录模型字段是:

class Catalog(models.Model):
name = models.CharField(max_length=191, null=True, blank=False)
...
team = models.ForeignKey(Team, on_delete=models.CASCADE, editable=False, related_name='catalogs')
whitelist_users = models.JSONField(null=True, blank=True, default=list) # If white list is null, it is open to whole team


Views.py
class CatalogViewSet(viewsets.ModelViewSet):
permission_classes = (IsOwnerAdminOrRestricted,)

def get_queryset(self):
result = []
user = self.request.user
catalogs = Catalog.objects.filter(team__in=self.request.user.team_set.all())
for catalog in catalogs:
if catalog.whitelist_users == [] or catalog.whitelist_users == None:
# catalog is open to whole team
result.append(catalog)
else:
# catalog is private
if user in catalog.whitelist_users:
result.append(catalog)
return result
所以这是我的逻辑;
1 - 如果目录的团队是当前用户的团队之一,则获取目录对象。
2 - 检查 catalog.whitelist_users 是否包含当前用户。 (还有一个异常(exception),如果没有则意味着它对整个团队开放,因此我可以在 ListView 中显示它。)
现在这有效,但由于我正在返回一个数组,它没有正确找到详细信息对象。我的意思是/catalog/ID 不能正常工作。
我是 DRF 的新手,所以我猜这里有问题。你会如何更好地实现这种过滤?

最佳答案

顾名思义,您需要返回一个查询集。此外,如果没有必要,请避免迭代查询集。最好在一次数据库命中中完成。对于复杂的查询,您可以使用 Q object .

from django.db.models import Q

# ...

def get_queryset(self):
user = self.request.user
catalogs = Catalog.objects.filter(
Q(whitelist_users__in=[None, []]) | Q(whitelist_users__contains=user),
team__in=user.team_set.all())

return catalogs
现在我不是 100% 确定 whitelist_users__contains=user会起作用,因为它取决于你如何构建你的 JSON,但这个想法就在那里,你只需要调整它包含的内容。
这将比在 python 中循环更有效,并且会尊重 get_queryset是为了。

关于Django Rest Framework 在 get_queryset 方法中过滤对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67203625/

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