'Date filter on model methods

Hi all this project I'm using python and Django.

I currently have a two models where I writing model methods to show certain linked fields(FOREIGN KEYS) I will show this below, now what I am trying to do is be able to filter by date these model methods, from what I have tried I am getting an error no signature for built in methods. So basically my template renders these model methods and now I want to search between date ranges.

The code below is my models and the methods as well as the function I am trying to filter these methods. Your feedback will be highly appreciated.


#Sales agent model in models.py
class SalesAgent(models.Model):
    user = models.OneToOneField(User,on_delete=models.SET_NULL,null=True,related_name="sauser")
    Team_leader = models.ForeignKey(TeamLeader,on_delete=models.SET_NULL,null=True,related_name="team_agent")
    SA_name = models.CharField(max_length=40)
    role = models.CharField(choices=Roles,default="default",max_length=13)
    def __str__(self):
        return self.user.username
    def sget_totals(self):
        today = datetime.date.today()
        return self.agent_sale.filter(Date_created__year=today.year,Date_created__month=today.month)
    def sget_confirmed(self):
        today = datetime.date.today()
        return self.agent_sale.filter(State="Confirmed",Date_created__year=today.year,Date_created__month=today.month)
    def sget_debi(self):
        today = datetime.date.today()
        return self.agent_sale.filter(AcknowledgeQA=True,State="Confirmed",Debi_status="Accepted",Date_created__year=today.year,Date_created__month=today.month)
    def sget_requested(self):
        today = datetime.date.today()
        return self.agent_sale.filter(Debi_status="Requested",Date_created__year=today.year,Date_created__month=today.month)
    def sget_cancelled(self):
        today = datetime.date.today()
        return self.agent_sale.filter(State="Cancelled",Date_created__year=today.year,Date_created__month=today.month)
    def sget_pending(self):
        today = datetime.date.today()
        return self.agent_sale.filter(State="Pending",Date_created__year=today.year,Date_created__month=today.month)

    #FILTERED SEARCH
    def sfget_totals(self):
        return self.agent_sale.all()
    def sfget_confirmed(self):
        return self.agent_sale.filter(State="Confirmed")
    def sfget_debi(self):
        return self.agent_sale.filter(AcknowledgeQA=True,State="Confirmed",Debi_status="Accepted")
    def sfget_requested(self):
        return self.agent_sale.filter(Debi_status="Requested")
    def sfget_cancelled(self):
        return self.agent_sale.filter(State="Cancelled")
    def sfget_pending(self):
        return self.agent_sale.filter(State="Pending")


#THIS IS THE FUNCTION IM TRYING in views.py

def asearch_stats(request):
    if request.method == "POST":
        from_date = request.POST['from']
        to_date = request.POST['to']
        flookup = SalesAgent.objects.filter(Q(agent_sale__Date_created__range=[from_date,to_date])).distinct
        return render(request,"Sales/salesfilter.html",{"from_date":from_date,'to_date':to_date,"flookup":flookup})
    else:
        return render(request,"Sales/index.html",{})




Solution 1:[1]

You probably want to use a custom Manager instead, something like this should work:

models.py

from .managers import SalesAgentManager

class SalesAgent(models.Model):

    user = models.OneToOneField(...)
    role = models.CharField(...)
    ...

    manager = SalesAgentManager

managers.py

class SalesAgentQuerySet(models.QuerySet): 

    def seller_roles(self):
        return self.filter(role='Seller')

    def superusers(self):
        return self.filter(user__is_superuser=True)


class SalesAgentManager(models.Manager):
    
    def get_queryset(self):
        return SalesAgentQuerySet(self.model, using=self._db)

Then, you can do:

# get all superuser sales agents:
superuser_sales_agents = SalesAgenet.objects.all().superusers()

# get all seller roles:
seller_roles = SalesAgent.objects.all().seller_roles()

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Daniel