如果找到湮灭对,Django ORM 排除结果

Posted

技术标签:

【中文标题】如果找到湮灭对,Django ORM 排除结果【英文标题】:Django ORM exclude result if found annihilation pair 【发布时间】:2020-01-20 11:47:50 【问题描述】:

我正在使用django-activity-stream 来克隆我的 Twitter 以获取乐趣并在白天之后磨练我的 Django 技能。现在我用它来跟踪我系统中的action。我在Tweet 消息上跟踪hidden and liked

Action.objects.filter(actor_content_type__id=user_ct.id,
   ...:            target_content_type__id=tweet_ct.id).values_list('target_object_id', 'target_content_type', 'verb')
Out[37]: <GFKQuerySet [('1', 28, 'hidden'), ('1', 28, 'liked')]>

这是queryset,我将它提供给DjangoREST 序列化程序以序列化出response

问题:hidden and liked 对被认为是湮灭案例(对不起,我不知道最好的术语,所以我采用粒子物理学术语来编程),我需要 blank queryset 作为一个答案

解决方法: 将主要model 切换到另一个并使用reverse 关系回到问题

问题: 如何进行像湮灭对用例这样的条件查询?

【问题讨论】:

【参考方案1】:

既然你没有提到任何性能限制,那么这个怎么样:

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')

然后,您将进入 user_actions 中只有那些不相互否定的人。

【讨论】:

如果对您有用,请不要忘记投票。 @sarit 你能补充一些细节吗?在第 3 行中,您只获得两组中的项目,接下来这些项目被排除在用户操作之外。 为什么这是真的,在不知道您的模型架构的情况下,第一次尝试很难猜到。我对查询进行了更改,假设两个操作的“target_object”将是相同的。

以上是关于如果找到湮灭对,Django ORM 排除结果的主要内容,如果未能解决你的问题,请参考以下文章

django中的orm中怎么对筛选结果去重

Django之ORM对数据库操作

Django ORM 和 SQLite 中的数学:如果舍入则忽略小数,如果不舍入则结果正确

django ORM:shell和应用程序之间的过滤结果不同

在另一个表中搜索整个单词的表,如果找到则从结果中排除

Django ORM数据库查询操作