#django
#django
Вопрос:
У меня есть простая команда Django, например, так:
class OrderQuerySet(models.query.QuerySet):
def filter_vendor(self, vendor):
return self.filter(agreement_vendors_merchandise_list__agreement_vendors__vendor = vendor)
def suggestions(self, legal_entity_own):
result = self.filter(status_id = 1, is_active_flg = 1)
pending_orders = Order.objects.filter_legal_entity_own(legal_entity_own).
with_pending_status()
vendor_id_list = pending_orders.values('agreement_vendors_merchandise_list__agreement_vendors__vendor').distinct()
vendors = Vendors.objects.exclude(id__in = vendor_id_list)
result = result.filter_vendors(vendors)
return result
class Order(models.Model):
objects = OrderQuerySet.as_manager()
def my_strange_behaviour_view
suggested_orders_qs = Order.objects.suggestions(legal_entity_own_instance).
filter(chosen_quantity__gt = 0)
order_qs_by_vendor = suggested_orders_qs.filter_vendor(v)
order_qs_by_vendor.update(status_id = 2) # This command makes the queryset empty
После этой команды наборы запросов становятся пустыми!
Я просто потерялся. И не могу найти никаких подсказок в документации. Кто-нибудь может объяснить, что происходит?
Комментарии:
1. Предложение — если вы пытаетесь создать многоступенчатый фильтр, вместо применения нескольких фильтров к набору запросов вы можете вместо этого создать список фильтров и применить его один раз в конце (то же самое с агрегатами, дополнительными значениями, исключениями, упорядочением).
2. Serg, не могли бы вы привести краткий пример того, что вы подразумеваете под «списком фильтров»
3. Я имею в виду, что вместо цепочки фильтров, подобных этому
queryset.filter(field1='value1').filter(field2='value2')
, было бы удобнее сначала создать словарь фильтровfilters={'field1': 'value1', 'field2': 'value2'}
, а затем применить их один разqueryset.filter(**filters)
Ответ №1:
Ваш suggestions
метод queryset, уже отфильтрованный с помощью status_id=1
so, когда вы обновили набор запросов с status_id=2
помощью queryset, просто не содержит дополнительных данных из-за фильтрации, применяемой через status_id=1
Для сохранения вам нужна мелкая копия исходного набора запросов перед обновлением:
import copy
original_qs = copy.copy(order_qs_by_vendor)
order_qs_by_vendor.update(status_id=2)
# now try to do original_qs.count() but it will still hold the status_id=1 though
Комментарии:
1. Ну, я вижу это. Вопрос в том, не предоставляет ли Django инструменты для обновления набора запросов, чтобы вы не потеряли коллекцию элементов?