在 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
获取Membership
s。
然而,在基于类的视图中在get_queryset
中使用它没有多大意义,因为该函数必须遵守其代码协定,并且添加额外的参数将不起作用:它只需要一个self
,和一个可选的queryset
。您可以添加额外的可选参数,但是当视图调用 get_queryset
时,它不会使用这些参数,或者至少在您不更改样板逻辑的情况下不会使用这些参数。
【讨论】:
以上是关于在 Django 查询集中动态定义过滤器参数的主要内容,如果未能解决你的问题,请参考以下文章
Django:在查询集中过滤 get_foo_display