Django querysets using __lte

Question:

Can I do something like this in django/python without hardcoding it?

def get_rating_average(self, type):
               return list(super().aggregate(Avg(type)).values())[0]

def filter_rating_average_under(self, type):
               return super().filter(type__lte=self.get_rating_average(type=type))
               # FILTER WHERE rating_type is smaller than average type keyword#

#In my views.py I call something like this:

    context['item8'] = Stock.aggregators.filter_rating_average_under(type='mykeyword')

I dont want to hardcode a keyword into a field so is there a way to format this code?
So that {type}__lte works and I can run this query with different keywords instead of only one?

Asked By: mika

||

Answers:

Yes, you can use:

from django.db.models import Q

def get_rating_average(self, type):
    return super().aggregate(result=Avg(type))['result']

def filter_rating_average_under(self, type):
    return super().filter(
        Q((f'{type}__lte', self.get_rating_average(type=type)))
    )
Answered By: Willem Van Onsem