我已经在Django中编写了应用程序并使用SQLite对其进行了测试。但是现在在制作中我想使用PostgreSQL和那个问题,因为调用:
empty_list = []
Foo.objects.exclude(pk__in=empty_list).delete()
引发ProgrammingError(错误的查询 - postgres不会在查询中接受空IN ()
)
我不想重写所有代码并将所有exclude
和filter
包装在检查空列表的方法中。我也不想编写数千个if
或修改Django代码。有没有优雅的解决方案来解决这个问题?
答案 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
但我个人不喜欢这个解决方案,所以我不会接受它,而是等待更好的解决方案。