Django查询:如何过滤掉ID在列表中的对象?

126

我该如何在查询中过滤掉ID属于列表中任何对象实例的结果?

假设我有:

object_id_list = [1, 5, 345]

MyObject.objects.filter(Q(time__gte=datetime.now()) & Q( ... what to put here? ... ))

类似于"SELECT * FROM ... WHERE id NOT IN (...)"的语句

3个回答

261
MyObject.objects.filter(time__gte=datetime.now()).exclude(id__in=object_id_list)

1
MyObject.objects 的名称是什么?我在哪里可以阅读关于这个类的信息? - Serge
1
@Serge,MyObject 只是与你的 Django 模型类相关联,无论它是什么。例如,如果你设置了 UserProfile 模型,则可能会使用 UserProfile.objects。 - codeguy
谢谢,但我正在询问.objects的具体含义。它是什么? - Serge
1
这是默认的ModelManager。 - bluppfisk
MyObject.objects.filter(time__gte=datetime.now()).exclude(id=object_id) 可以翻译为“筛选出时间大于等于当前时间且不包含指定对象ID的 MyObject 对象”。 - Jawad Hussain Shah

33

你也可以使用 Q 对象来实现这一点:

from django.db.models import Q

MyObject.objects.filter(time__gte=datetime.now()).filter(~Q(id__in=object_id_list))

~符号是否可以用来否定过滤器? - joninx
是的,它确实否定了该过滤器。 - dipole_moment

0

试试这个:

from django.db import connection
def executeQuery(self, sql, params=[]):
  with connection.cursor() as cursor:
     cursor.execute(
        sql,
        params
      )

使用:

list = [1, 2, 3]

"""只有在比较整数时才添加map(str,list)"""

if len(list) > 0: # only if the list is not empty 
   executeQuery(f"SELECT * FROM WHERE id NOT IN ({({','.join(map(str, list))})})")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接