Django — удаление элементов из select при сохранении исходного запроса

#django

Вопрос:

Мне интересно, есть ли у Django функции для удаления определенных элементов из списка после их добавления. Например, допустим, у меня есть запрос, который выглядит так:

 FooBar.objects.annotate(
    field_1=field_1,
    field_2=field_1,
    field_3=field_1
).filter(
    some_filter_set
)

would produce SQL like so:

select field_1, field_2, field_3 from foo_bar where some_filter_set
 

После того, как первоначальный запрос был сделан, я хотел бы сохранить этот запрос и создать еще одну копию, которая будет точно такой же, но сведена только к полю_1 в выборе. Предоставляет ли Django функциональность для непосредственного редактирования выбора?

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

Спасибо!

Ответ №1:

Как насчет чего-то вроде этого?

 values_list = ['field1', 'field2', ...]

# add or remove fields from the list as necessary:
...

queryset = FooBar.objects.filter(some_filter_set).values(*values_list)
 

Или, если вы хотите придерживаться annotate , мы используем python, так что:

 annotation_dictionary = {
    "new_field_name_1" : "field_name_1",
    "new_field_name_2" : "field_name_2",
    ...
}

# add or remove entries from the dictionary as necessary:
...

FooBar.objects.annotate(
    **annotation_dictionary 
).filter(
    some_filter_set
)