Python Django ORM排除结果(如果找到湮灭对)

Python Django ORM排除结果(如果找到湮灭对),python,django,orm,Python,Django,Orm,我用它来克隆我的推特是为了好玩,并在白天之后磨练我的Django技能。现在我使用它来跟踪系统中的操作。我正在跟踪推特消息中的隐藏和喜欢 Action.objects.filter(actor\u content\u type\u id=user\u ct.id, …:target\u content\u type\u id=tweet\u ct.id).值列表('target\u object\u id','target\u content\u type','verb') 出[37]: 这是q

我用它来克隆我的推特是为了好玩,并在白天之后磨练我的Django技能。现在我使用它来跟踪系统中的
操作。我正在跟踪
推特
消息中的
隐藏和喜欢

Action.objects.filter(actor\u content\u type\u id=user\u ct.id,
…:target\u content\u type\u id=tweet\u ct.id).值列表('target\u object\u id','target\u content\u type','verb')
出[37]:
这是
queryset
,我向
DjangoREST
序列化程序提供数据,以序列化
响应

问题:
隐藏和喜欢的
对被视为湮灭情况(抱歉,我不知道最好的术语,所以我采用粒子物理术语进行编程),我需要
空白查询集
作为答案

解决方法:
将main
model
切换到另一个,然后使用
reverse
关系返回问题

问题:

如何创建条件查询,如湮灭对用例?

既然您没有提到任何性能限制,那么以下内容如何:

hidden_actions = Action.objects.filter(actor_content_type__id=user_ct.id, target_content_type__id=tweet_ct.id, verb='hidden').values_list('target_object_id', flat=True)
like_actions = Action.objects.filter(actor_content_type__id=user_ct.id, target_content_type__id=tweet_ct.id, verb='liked').values_list('target_object_id', flat=True)
exclusion = set(hidden_actions) & set(like_actions)
user_action = Action.objects.filter(actor_content_type__id=user_ct.id, target_content_type__id=tweet_ct.id).exclude(target_object_id__in=exclusion).values_list('target_object_id', 'target_content_type', 'verb')

然后,您将只获得一千个不会相互否定的用户操作。

既然您没有提到任何性能限制,那么这样如何:

hidden_actions = Action.objects.filter(actor_content_type__id=user_ct.id, target_content_type__id=tweet_ct.id, verb='hidden').values_list('target_object_id', flat=True)
like_actions = Action.objects.filter(actor_content_type__id=user_ct.id, target_content_type__id=tweet_ct.id, verb='liked').values_list('target_object_id', flat=True)
exclusion = set(hidden_actions) & set(like_actions)
user_action = Action.objects.filter(actor_content_type__id=user_ct.id, target_content_type__id=tweet_ct.id).exclude(target_object_id__in=exclusion).values_list('target_object_id', 'target_content_type', 'verb')

然后,您将只获得一千个不会相互否定的用户操作。

如果答案对您有用,请不要忘记投票。@sarit您可以添加更多详细信息吗?在第三行中,两个集合中都只有项目,接下来这些项目将从用户操作中排除。为什么这是真的,在不知道模型模式的情况下,第一次尝试是很难猜测的。我对查询进行了更改,假设两个操作的“target\u object”相同。如果答案对您有用,请不要忘记投票。@sarit您可以添加更多详细信息吗?在第三行中,两个集合中都只有项目,接下来这些项目将从用户操作中排除。为什么这是真的,在不知道模型模式的情况下,第一次尝试是很难猜测的。我对查询进行了更改,假设两个操作的“target\u object”相同。