如果找到湮灭对,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 和 SQLite 中的数学:如果舍入则忽略小数,如果不舍入则结果正确