Уведомления

Группа в Telegram: @pythonsu

#1 Март 28, 2020 14:44:30

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

как обьединить несколько Queryset в один?

Первый 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
как мне это сделать?
благодарю заранее

Отредактировано gtlhbkkj (Март 28, 2020 14:45:19)

Офлайн

#2 Март 28, 2020 15:05:16

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

как обьединить несколько Queryset в один?

Что за queryset, откуда взялся, какой тип - хрен его знает, вероятно это все несущественная информация.

gtlhbkkj
Скажите пожалуйста, у меня есть овощи в холодильнике, их лучше варить или жарить? А еще, у меня дома живет питомец, каким кормом его лучше кормить? А еще есть две бабы, одна Лена, а другая Катя, как думаете, какая красивее?



Офлайн

#3 Март 28, 2020 15:19:56

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

как обьединить несколько Queryset в один?

это функция из 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)

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


Отредактировано gtlhbkkj (Март 28, 2020 15:30:23)

Офлайн

#4 Март 28, 2020 15:41:34

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

как обьединить несколько Queryset в один?

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

gtlhbkkj
в цикле меняется вот этот параметр iteration_result и получается несколько кверисетов с одинаковой структурой и разными данными.
ну и зачем тогда этот цикл? Сначала вы фильтруете в цикле, а потом объединяете выборки. Так не фильтруйте, не надо будет объединять.



Офлайн

#5 Март 28, 2020 15:57:11

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

как обьединить несколько Queryset в один?

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],
        )

Отредактировано gtlhbkkj (Март 28, 2020 16:13:46)

Офлайн

#6 Март 28, 2020 16:13:50

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

как обьединить несколько Queryset в один?

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)) 
и не надо будет ничего объединять



Офлайн

#7 Март 28, 2020 16:26:21

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

как обьединить несколько Queryset в один?

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"),

Офлайн

#8 Март 28, 2020 16:44:39

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

как обьединить несколько Queryset в один?

gtlhbkkj
внимательно посмотрите на пример, который я дал и вы увидите один маленький нюанс



Офлайн

#9 Март 28, 2020 17:09:00

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

как обьединить несколько Queryset в один?

FishHook
gtlhbkkj
внимательно посмотрите на пример, который я дал и вы увидите один маленький нюанс
ясно, благодарю вас за ваше время. Это не совсем то.

Мне нужно отфильтровать несколько раз по разным параметрам - сначала по одному, потом по другому, и так далее, не смешивая результаты. Потом в итоге мне нужен один квери вот такого вида
country_1, 100, 111, 101
country_2, 200, 222, 202
country_3, 300, 333, 303
где каждый столбец (одно поле) в квери кроме первого - это результат фильтрации по каждому отдельному параметру.
Этот итоговый квери хочу передать в шаблон.

Отредактировано gtlhbkkj (Март 28, 2020 17:20:48)

Офлайн

#10 Март 28, 2020 17:24:19

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

как обьединить несколько Queryset в один?

gtlhbkkj
превратите ваш квери в список, словарь или какую-либо другую структуру и объединяйте их как угодно



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version