Django — набор запросов исчезает после команды обновления

#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 инструменты для обновления набора запросов, чтобы вы не потеряли коллекцию элементов?