Django ORM过滤器返回所有对象

时间:2016-01-04 18:19:02

标签: python django django-models django-orm

我的模型Book有一个字段year_of_publishing。用户输入年份,我想过滤Book的集合,获取当年发布的所有书籍。

year = self.cleaned_data.get('year', SOME_DEFAULT_VALUE)
books = Book.objects.filter(year_of_publishing=year)

但是用户可能会将year字段留空,我想要设置一些默认值,在.filter函数中获取Django ORM将返回所有书籍,例如此过滤器根本不存在。我应该使用什么价值?我认为它应该是独立的类型,所以我可以将它用于Char-,Choice-和其他类型的字段。

2 个答案:

答案 0 :(得分:3)

您可以使用字典构建查询集:

parameters = ['year', 'foo', 'bar']
query_dict = {}

for parameter in parameters;
    if self.cleaned_data.get(parameter, None):
        query_dict[parameter] = self.cleaned_data.get(parameter)

books = Book.objects.filter(**query_dict)

答案 1 :(得分:3)

您可以将空字典传递给.filter()以返回所有结果,或过滤所需的字段/值:

filters = {}

year = request.GET.get('year')
if year:
    filters['year'] = year

books = Book.objects.filter(**filters)