PostgreSQL - 检查空列表

时间:2014-08-18 06:52:19

标签: django postgresql

我已经在Django中编写了应用程序并使用SQLite对其进行了测试。但是现在在制作中我想使用PostgreSQL和那个问题,因为调用:

empty_list = []
Foo.objects.exclude(pk__in=empty_list).delete()

引发ProgrammingError(错误的查询 - postgres不会在查询中接受空IN ()

我不想重写所有代码并将所有excludefilter包装在检查空列表的方法中。我也不想编写数千个if或修改Django代码。有没有优雅的解决方案来解决这个问题?

1 个答案:

答案 0 :(得分:1)

好的,我发现了这个:http://www.tryolabs.com/Blog/2013/07/05/run-time-method-patching-python/

这很简单,就像这样写:

from django.db.models import QuerySet


def new_exclude(self, *args, **kwargs):
    kw = dict()
    for key, value in kwargs.items():
        if is_not_empty_list(value) and is_not_empty_queryset(value): #other checks?
           kw[key] = value

    if len(kw):
        return old_exclude(self, *args, **kw)
    else:
        return self

old_exclude = QuerySet.exclude
QuerySet.exclude = new_exclude

但我个人不喜欢这个解决方案,所以我不会接受它,而是等待更好的解决方案。