Найти - Пользователи
Полная версия: как обьединить несколько Queryset в один?
Начало » Python для новичков » как обьединить несколько Queryset в один?
1 2
gtlhbkkj
Первый queryset qset01 содержит следущую информацию
 country_1, 100
country_2, 200
country_3, 300
второй qset02
 country_1, 111
country_2, 222
country_3, 333
третий qset03
 country_1, 101
country_2, 202
country_3, 303
Финальный queryset хотелось бы видеть в таком виде
 country_1, 100, 111, 101
country_2, 200, 222, 202
country_3, 300, 333, 303
как мне это сделать?
благодарю заранее
FishHook
Что за queryset, откуда взялся, какой тип - хрен его знает, вероятно это все несущественная информация.

gtlhbkkj
Скажите пожалуйста, у меня есть овощи в холодильнике, их лучше варить или жарить? А еще, у меня дома живет питомец, каким кормом его лучше кормить? А еще есть две бабы, одна Лена, а другая Катя, как думаете, какая красивее?
gtlhbkkj
это функция из view.py c querysetom
в цикле меняется вот этот параметр iteration_result и получается несколько кверисетов с одинаковой структурой и разными данными. То есть первый столбик кверисета это обозначение страны, второй столбик это название страны (у всех кверисетов эти два столбика идентичны) и третий столбик меняется - там цифры - у каждого кверисета эти цифры разные.

 def function(request):
    iteration_result = "i_01"
    qset1 = BigTable.objects.values(
        'deb_nr_f__dcountry__wcode_f__code',
        'deb_nr_f__dcountry__wcode_f__code_name',
        ).annotate(
            tmp_code=F('deb_nr_f__dcountry__wcode_f__code'),
            tmp_descr=F('deb_nr_f__dcountry__wcode_f__code_name')
            ).values('tmp_code','tmp_descr'
        ).order_by('-abs_2016__sum'
        ).annotate(
            abs_2016__sum=Sum('abs_2016'),
        ).filter(id_nr_f__ie_code__unomer_f__nomer=iteration_result,
        )

это модель таблицы
 class BigTable(models.Model):
    deb_nr_f = models.ForeignKey(Debitor, on_delete=models.CASCADE, related_name='debitor_fnr', verbose_name='Debitor FNr', blank=True, null=True)
    id_nr_f = models.ForeignKey(Material, on_delete=models.CASCADE, related_name='material', verbose_name='Material', blank=True, null=True)
    abs_2016 = models.IntegerField('Abs. 2016', default=0)
    abs_2017 = models.IntegerField('Abs. 2017', default=0)
    abs_2018 = models.IntegerField('Abs. 2018', default=0)
    abs_2019 = models.IntegerField('Abs. 2019', default=0)
    abs_2020 = models.IntegerField('Abs. 2020', default=0)

результат кверисета следующий


FishHook
gtlhbkkj
1) Вы понимаете, что кроме Джанги есть еще 100500 фреймворков? Понятия queryset и view не ассоциируются строго с Джангой. У нас есть специальный топик посвещенный Джанге, если вы пишите в неспециализированный форум, пожалуйста, пишите подробно о чем идет речь, не заставляйте людей догадываться о ваших проблемах.
2)
gtlhbkkj
в цикле меняется вот этот параметр iteration_result и получается несколько кверисетов с одинаковой структурой и разными данными.
ну и зачем тогда этот цикл? Сначала вы фильтруете в цикле, а потом объединяете выборки. Так не фильтруйте, не надо будет объединять.
gtlhbkkj
FishHook
ну и зачем тогда этот цикл?

вы имеете в виду что я неправильно кверисет пишу?
мне нужно что-то похожее на следующее
добавил параметр по которой кверисет должен фильтроваться в цикле - этот параметр берется из связанной таблицы AnotherTable. Внизу кверисета также добавил цикл - но так не работает. А что неправильно - интеллект не позволяет понять.

  def function(request):
    #iteration_result = "i_01"
    qs = AnotherTable.objects.all()
    qset1 = BigTable.objects.values(
        'deb_nr_f__dcountry__wcode_f__code',
        'deb_nr_f__dcountry__wcode_f__code_name',
        ).annotate(
            tmp_code=F('deb_nr_f__dcountry__wcode_f__code'),
            tmp_descr=F('deb_nr_f__dcountry__wcode_f__code_name')
            ).values('tmp_code','tmp_descr'
        ).order_by('-abs_2016__sum'
        ).annotate(
            abs_2016__sum=Sum('abs_2016'),
        ).filter(id_nr_f__ie_code__unomer_f__nomer=[q.code for q in qs],
        )
FishHook
gtlhbkkj
Я вас не понимаю. Возможно я вашу задачу не очень понимаю. Давайте возьмем пример проще. Допустим, у меня есть такая таблица - список населения для городов
| id | city_id | population | 

Вы делаете что-то вроде такого
 for city_id in (1, 2, 3):
     population = Population.objects.filter(city_id=city_id) 

а потом объединяете выборки
я не разбирался в деталях вашего запроса, но у меня сразу возникает вопрос, почему не сделать вот так
 population = Population.objects.filter(city_id__in=(1, 2, 3)) 
и не надо будет ничего объединять
gtlhbkkj
FishHook
и не надо будет ничего объединять

у меня параметры по которым фильтруется меняются вот так “i_01”, “i_02”,…..

вот в таком виде фильтр работает и выходит кверисет отфильтрованный по одному параметру “i_01”
 ).filter(id_nr_f__ie_code__unomer_f__nomer=("i_01"),

а в таком виде возвращается пустой кверисет
 ).filter(id_nr_f__ie_code__unomer_f__nomer=("i_01", "i_02"),
FishHook
gtlhbkkj
внимательно посмотрите на пример, который я дал и вы увидите один маленький нюанс
gtlhbkkj
FishHook
gtlhbkkj
внимательно посмотрите на пример, который я дал и вы увидите один маленький нюанс
ясно, благодарю вас за ваше время. Это не совсем то.

Мне нужно отфильтровать несколько раз по разным параметрам - сначала по одному, потом по другому, и так далее, не смешивая результаты. Потом в итоге мне нужен один квери вот такого вида
country_1, 100, 111, 101
country_2, 200, 222, 202
country_3, 300, 333, 303
где каждый столбец (одно поле) в квери кроме первого - это результат фильтрации по каждому отдельному параметру.
Этот итоговый квери хочу передать в шаблон.
FishHook
gtlhbkkj
превратите ваш квери в список, словарь или какую-либо другую структуру и объединяйте их как угодно
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB