Django FieldError : Невозможно преобразовать ключевое слово 'total_sales' в поле

Вот запрос, который я выполняю для получения общего объема продаж для каждой стороны.

Party.objects.annotate(total_sales=Sum('sales__salestransaction__total_cost'))

Он показывает правильные результаты. Но когда я пытаюсь применить его в моем представлении с помощью get_queryset, он не работает и показывает FieldError, а именно:

Невозможно преобразовать ключевое слово 'total_sales' в поле. Варианты: party_address, party_id, party_name, party_phone, sales

Мое мнение

class PartyListView(ListView):    
    paginate_by = 2
    model = Party
    template_name = 'mael/parties.html'

    def querystring(self):
        qs = self.request.GET.copy()
        qs.pop(self.page_kwarg, None)        
        return qs.urlencode()

    def get_queryset(self):
        qs = super().get_queryset()
        if 'q' in self.request.GET:
            search_txt = self.request.GET['q']           
            qs = qs.filter(party_name__icontains=search_txt).annotate(total_sales=Sum('sales__salestransaction__total_cost'))
                        
        return qs.order_by('total_sales')

    def get(self, request):
        form = PartyForm()        
        party_list = self.get_queryset()
        qrstring = self.querystring()

        paginator = Paginator(party_list, 5)
        page_number = request.GET.get('page')
        party_list = paginator.get_page(page_number)

        return render(request, self.template_name, {'form': form, 'party_list': party_list, 'querystring': qrstring})

Модели

class Party(models.Model):
    party_id = models.BigAutoField(primary_key=True)
    party_name = models.CharField(max_length=128)
    party_phone = models.CharField(max_length=128)
    party_address = models.CharField(max_length=128)        

    def __str__(self):
        return self.party_name
        
class Sales(models.Model):
    invoice_no = models.BigAutoField(primary_key=True)
    invoice_date = models.DateField(default=date.today)
    party = models.ForeignKey(Party, on_delete=models.CASCADE)    

    def __str__(self):
        return str(self.invoice_no)

class SalesTransaction(models.Model):
    sales = models.ForeignKey(Sales, on_delete=models.CASCADE)        
    item_qty = models.PositiveIntegerField(default=0)
    total_cost = models.PositiveIntegerField(default=0)

    def __str__(self):
        return self.item_name

Что за проблема с функцией get_queryset и как решить эту ошибку? Пожалуйста, помогите.

Вы не можете .order_by('total_sales') в случае, если if 'q' in self.request.GET возвращает False, таким образом, вы должны аннотировать в обоих случаях:

def get_queryset(self):
    qs = super().get_queryset().annotate(
        total_sales=Sum('sales__salestransaction__total_cost')
    )
    if 'q' in self.request.GET:
        search_txt = self.request.GET['q']           
        qs = qs.filter(party_name__icontains=search_txt)
                        
    return qs.order_by('total_sales')
Вернуться на верх