在 Django 查询集中动态定义过滤器参数

Posted

技术标签:

【中文标题】在 Django 查询集中动态定义过滤器参数【英文标题】:Define filter parameters dynamically in django queryset 【发布时间】:2021-03-23 16:23:27 【问题描述】:

假设我们有这样一个模型:

class Membership(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)

我们可以将x作为一个变量放在过滤器中,这样我们就可以在调用get_queryset函数时通过提供不同的参数来获得不同的查询集?

def get_queryset(x, y):
    queryset = Membership.objects.filter(x=y)
    return queryset

【问题讨论】:

你什么时候打电话给get_queryset?在基于类的视图中,它由视图样板调用。 您到底想要实现什么?现在,您关注的是如何实现这一目标,而不是什么。 【参考方案1】:

Q object [Django-doc] 可以采用 2 元组,第一项是指定“key”的字符串,第二项是“value”,所以你可以过滤:

from django.db.models import Q

x = 'person_id'
y = 14

Membership.objects.filter(Q((x, y)))

person_id=14获取Memberships。

然而,在基于类的视图中在get_queryset 中使用它没有多大意义,因为该函数必须遵守其代码协定,并且添加额外的参数将不起作用:它只需要一个self,和一个可选的queryset。您可以添加额外的可选参数,但是当视图调用 get_queryset 时,它不会使用这些参数,或者至少在您不更改样板逻辑的情况下不会使用这些参数。

【讨论】:

以上是关于在 Django 查询集中动态定义过滤器参数的主要内容,如果未能解决你的问题,请参考以下文章

Django:从查询集中删除过滤条件

Django:在查询集中过滤 get_foo_display

基于 Django 查询集中外键字段的 .count() 进行过滤

如何使用动态过滤器制作 django 查询集?

django 设计模式/最佳实践:过滤查询集

在django中动态添加参数到queryset过滤器调用[重复]