当前位置: 首页 > 知识库问答 >
问题:

你能在模型中按用户筛选查询集吗?

子车海
2023-03-14

我认为按用户筛选对象的正确方法是在视图中完成的,因为您可以很容易地要求登录,并且可以访问request.user。但是我有一个调用对象的classmethod的视图,它不能与筛选器结合,因为它将queryset转换为list对象-所以我想如果有一种方法可以通过用户直接在模型中筛选queryset,那么当我在视图中调用classmethod时,对象就已经被筛选了。

以下是我的观点:

def leads_by_city(request):
    # Invoke Lead classmethod to get the data
    data = Lead.objects.get_leads_per_city()

    return JsonResponse(data, safe=False)

带有自定义管理器的模型:

class Lead(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
    source = models.ForeignKey(LeadSource, on_delete=models.CASCADE)
    city = models.CharField(max_length=100)
    objects = LeadManager()


class LeadManager(models.Manager):

    def get_leads_per_city(self):
        queryset = self.values('city').annotate(Count('id')).order_by('city')
        data = list(queryset.values('city', 'id__count'))

        return data

在ClassMethod中有没有按用户筛选的方法?也许像:

class LeadManager(models.Manager):

    def get_leads_per_city(self,user):
        queryset = self.filter(user=Lead.user).values('city').annotate(Count('id')).order_by('city')
        data = list(queryset.values('city', 'id__count'))

        return data

共有1个答案

井逸明
2023-03-14

是的,尽管您的筛选有点不正常,但您可以简单地设置.filter(user=user):

class LeadManager(models.Manager):

    def get_leads_per_city(self, user):
        queryset = self.filter(
            user=user
        ).values('city').annotate(Count('id')).order_by('city')
        return list(queryset.values('city', 'id__count'))

user=user参数名称不引用函数的user参数。Django ORM将查找具有该名称的字段,我们将参数调用的user传递给它。

在您看来,您可以使用以下命令调用此命令:

def leads_by_city(request):
    # Invoke Lead classmethod to get the data
    data = Lead.objects.get_leads_per_city(request.user)
    return JsonResponse(data, safe=False)

话虽如此,这里您使用Django的queryset机制来生成字典。这通常是不可取的。您可能希望使用序列化器,这是Django REST框架[drf-doc]提供的。

此外,将列表作为JSON响应传递也不是一个好主意。JSON利用了这个漏洞,您最好将其封装在字典中。

由于您需要登录的用户,因此最好在此处添加@login_required修饰符[Django-doc],如果用户尚未登录,它将返回HTTP重定向响应:

from django.contrib.auth.decorators import login_required

@login_required
def leads_by_city(request):
    # Invoke Lead classmethod to get the data
    data = Lead.objects.get_leads_per_city(request.user)
    return JsonResponse({'data': data})
 类似资料:
  • 是否有方法将queryset筛选器与模板标记结合起来? 我正在努力做到以下几点: 其他变体: 有没有办法得到我需要的过滤?我正在尝试为超级用户/工作人员和常规用户显示不同的查询集,这样我就可以进行一些状态更新等,而不必进入管理页面。

  • 我想知道如何按日期字段筛选firebase firestore,因为我看不到字符串、数字、布尔值以外的数据类型 如下所示,如果有人找到了一种基于日期字段筛选firestore集合的方法,请提供建议。

  • 为了提供良好的用户体验,实现需要做一些事情 视图中的 : 检查传递的筛选器参数是否有效 检查筛选器的类型(基于其他模型或自定义筛选器),以便将正确的条件应用于查询集 (可选)使筛选器累积的方法(即可以不断添加筛选器) 根据筛选器选择显示正确的结果集n 显示筛选器时,请识别应用的筛选器,以便当前应用的筛选器显示为文本,而不是超链接。

  • 我看不到任何关于何时应该使用查询或过滤器或两者结合的描述。他们之间有什么区别?谁能解释一下吗?

  • 我想用Django的。具有相关子对象列表的filter()方法返回包含所有子记录的父对象集。见下面的例子。 用户是父对象,颜色是与用户直接相关的子对象 用户1有颜色 User2有颜色 User3有颜色 User4有颜色 “颜色”是由帖子设置的列表。例如, 当前,用户包含具有任何的用户集。对于上面的示例集,我目前正在使用上面的代码获取、、和。也就是说,它正在使用OR搜索。我只想返回具有所有指定颜色的

  • 基本上,我希望使用过滤泛型(扩展集合),然后返回相同泛型集合实现的实例(最好是新实例),例如实现方法签名。 null null null 修改原始列表