On 14 фев, 15:21, myx <
i.virab...@gmail.com> wrote:
> Thank you for the reply. But I meant a slightly different case:
>
> Item.objects.filter(...).order_by(...).values_list('id', flat=True)[:
> 10]
>
> As you can see, there are four cloning operations. Wouldn't be
> chaining possible without cloning the queryset? The method could just
> return the original queryset. Seems like I'll have to write raw
> queries in such cases :(
My own hacky solutions is:
class QuerySetMixin(object):
def __init__(self, *args, **kwargs):
self._no_monkey.__init__(self, *args, **kwargs)
self._inplace = False
def inplace(self):
self._inplace = True
return self
def _clone(self, klass=None, setup=False, **kwargs):
if self._inplace and klass is None:
self.__dict__.update(kwargs)
return self
else:
clone = self._no_monkey._clone(self, klass, setup,
**kwargs)
clone._inplace = self._inplace
return clone
QuerySet._no_monkey.__init__ = QuerySet.__init__
QuerySet._no_monkey._clone = QuerySet._clone
QuerySet.__init__ = QuerySetMixin.__init__
QuerySet._clone = QuerySetMixin._clone
QuerySet.inplace = QuerySetMixin.inplace
Can be used as:
Item.objects.all().inplace().filter(...).order_by(...).values_list('id',
flat=True)[:
10]