Ivan Borshchov
Ivan Borshchov

Reputation: 3574

Compute multiple model properties in one call

I have Django Model which has two properties:

class M(Model):

    @property
    def p1(self):
        return process_result(SomeModel.objects.filter(val_gt=1))

    @property
    def p2(self):
        return process_result(SomeModel.objects.filter(val_lt=1))

And both used in Django Admin list_lisplay = ('p1','p2',) I want to replace 2 database queries with 1, something like this

class M(Model):

    def some_hook(self): 
        res = SomeModel.objects.all()
        self.p1 = process_result(filter(lambda l:l.val > 10, res))
        self.p2 = process_result(filter(lambda l:l.val < 10, res))

PS: problem with >10 or <10 is just an example for simplification, I am only trying to find a way how to define multiple properties with performing one common database query

Upvotes: 0

Views: 59

Answers (1)

Dima  Kudosh
Dima Kudosh

Reputation: 7386

You can try to cache your queryset result in model:

class M(Model):

    def get_some_model(self):
        attr_name = '_some_model_cache'
        if hasattr(self, attr_name):
            return getattr(self, attr_name)
        qs = SomeModel.objects.all()
        setattr(self, attr_name, qs)
        return qs

    @property
    def p1(self):
        return process_result(filter(lambda l:l.val > 10, self.get_some_model()))

    @property
    def p2(self):
        return process_result(filter(lambda l:l.val < 10, self.get_some_model()))

Upvotes: 1

Related Questions