Можно ли объединить несколько values_list () в Django? - PullRequest
0 голосов
/ 22 февраля 2019

Как видно из заголовка, у меня есть несколько наборов запросов, каждый из которых возвращает список значений.Затем я использую список значений для фильтрации другого набора запросов.На данный момент я могу выполнить этот второй шаг только по одному набору запросов за раз.Можно ли объединить мои списки начальных значений в один супер длинный список?Я пытаюсь создать функцию, похожую на активность / новостную ленту.

views.py:

cookie_ids = Cookie.objects.filter(board__pk=self.kwargs['pk']).values_list('id',
                                                           flat=True)

sugar_ids = Sugar.objects.filter(board__pk=self.kwargs['pk']).values_list('id',
                                                           flat=True)

**then:
context['cookie_actions'] = Action.objects.filter(target_id__in=cookie_ids)
context['sugar_actions'] = Action.objects.filter(target_id__in=sugar_ids)

Редактировать: я думаю, что это единственная модель, которая может иметь значение

Models.py:
class Action(models.Model):
    user = models.ForeignKey(User,
                             related_name='actions',
                             db_index=True)
    verb = models.CharField(max_length=255)

    target_ct = models.ForeignKey(ContentType,
                                  blank=True,
                                  null=True,
                                  related_name='target_obj')
    target_id = models.PositiveIntegerField(null=True,
                                            blank=True,
                                            db_index=True)
    target = GenericForeignKey('target_ct', 'target_id')
    created = models.DateTimeField(auto_now_add=True,
                                   db_index=True)

    class Meta:
        ordering = ('-created',)

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Я думаю, это то, что вы хотите

cookie_ids=Cookie.objects.filter(board__pk=self.kwargs['pk']).values_list('id',flat=True)

sugar_ids=Sugar.objects.filter(board__pk=self.kwargs['pk']).values_list('id',Ôflat=True)

ids_list = list(cookie_ids) + list(sugar_ids)
context['total_actions'] = Action.objects.filter(target_id__in=ids_list)
0 голосов
/ 22 февраля 2019

Использование union

cookie_ids = Cookie.objects.filter(board__pk=self.kwargs['pk']).values_list('id',
                                                           flat=True)

sugar_ids = Sugar.objects.filter(board__pk=self.kwargs['pk']).values_list('id',
                                                           flat=True)

target_ids = cookie_ids.union(sugar_ids)

Мои рекомендации:

0 голосов
/ 22 февраля 2019

Вы можете использовать chain для объединения ваших наборов запросов

from itertools import chain
cookie_ids = Cookie.objects.filter(board__pk=self.kwargs['pk']).values_list('id',flat=True)

sugar_ids = Sugar.objects.filter(board__pk=self.kwargs['pk']).values_list('id',Ôflat=True)

ids_list = chain(cookie_ids, sugar_ids)
context['total_actions'] = Action.objects.filter(target_id__in=ids_list)
...