Django ORM исключить результат, если найдена аннигиляционная пара - PullRequest
1 голос
/ 20 января 2020

Я использую django-activity-stream, чтобы сделать мой клон твиттера для развлечения и оттачивать свои навыки Django после дневного времени. Теперь я использую его для отслеживания action в моей системе. Я отслеживаю hidden and liked в сообщении Tweet

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 Ответ

0 голосов
/ 20 января 2020

Поскольку вы не упомянули каких-либо ограничений производительности, как насчет этого:

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 только те, которые не отменяют друг друга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...