как заказать набор запросов в модели Django по реляционному внешнему ключу - PullRequest
0 голосов
/ 24 января 2020

У меня есть следующие модели

models.py

class Category(models.Model):
      label = models.CharField(max_length=100, unique=True)
      description = models.CharField(max_length=255, blank=True)

class Expense(models.Model):
    description = models.CharField(max_length=255, blank=True)
    amount = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)
    category = models.ForeignKey(
        Category,
        on_delete=models.CASCADE,
        null=True,
        related_name='category'
)
class CategoryViewSet(viewsets.ModelViewSet):
    queryset = Category.objects.order_by("-expense__expense")

Я изо всех сил пытаюсь вернуть список категорий, упорядоченный по наиболее выбранной категории в модели расходов. как:

<Expense category=3>
<Expense category=3>
<Expense category=2>
<Expense category=3>
<Expense category=1>
<Expense category=1>

Я хочу вернуться в следующем порядке:

<Category id=3>
<Category id=1>
<Category id=2>

Решение использует аннотирование:

queryset = Category.objects.annotate(
        expense_count=Count('category')).order_by('-expense_count')

Ответы [ 4 ]

0 голосов
/ 24 января 2020

Просто добавьте .distinct ('field-name') в конце запроса. как это

queryset = Category.objects.order_by("-expense__expense").distinct('category')
0 голосов
/ 24 января 2020

Мы можем использовать аннотировать для достижения этого:

from django.db.models import Count

...

queryset = Category.objects.annotate(expense_count=Count('expense')).order_by('-expense_count')
0 голосов
/ 24 января 2020
from django.db.models import Count

Category.objects.annotate(expense_count=Count('category')).order_by('-expense_count')

Это основано на определении вашей модели, но я предлагаю изменить related_name на термин, относящийся к Expense, например expenses. Поскольку related_name указывает имя, которое вы используете для обратных запросов.

0 голосов
/ 24 января 2020

Использование Django прекрасных функций агрегирования .

queryset = Category.objects.annotate(expense_count=Count('expense')).order_by('-expense_count')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...