Вложенный запрос на основе Select Related в Django Models

У меня есть две модели, где вторая имеет зависимость от первой. Структура выглядит следующим образом.

class Crop(models.Model):
    name = models.CharField(max_length=100, unique=True)
    description = models.TextField(null=True, blank=True)

другой -

class Plotting(models.Model):
    crop = models.ForeignKey(
        Crop, on_delete=models.CASCADE, limit_choices_to={"is_active": True}
    )

    sowing_date = models.DateField(null=True, blank=True)
    harvesting_date = models.DateField(null=True, blank=True)

    acre = models.DecimalField(
        max_digits=10, decimal_places=2, default=0, help_text="Area in Acres"
    )

Я хочу получить данные в следующем формате.

CROP NAME | JAN | FEB | MAR | APR | MAY
crop 1    | 20  | 10  | 35  | 45  | 35 
crop 2    | 20  | 10  | 35  | 45  | 35
crop 3    | 20  | 10  | 35  | 45  | 35
crop 4    | 20  | 10  | 35  | 45  | 35

CROP 1 JAN определяет сумму акров, собранных в январе на основе даты сбора урожая (harvesting_date). Я также хочу отфильтровать по датам и исключить культуры, чье значение суммы акров равно 0.

Можно задать запрос следующим образом:

queryset = Crop.objects.values('name')
queryset = queryset.aggregate(harvesting_date_jan=Count('harvesting_date', filter=Q(harvesting_date__month=1)))
queryset = queryset.aggregate(harvesting_date_feb=Count('harvesting_date', filter=Q(harvesting_date__month=2)))
...

один способ получения необходимых данных

p = Plotting.objects.all() # could filter for date and exclude acre == 0 
p = p.values('crop__name', 'harvesting_date__month').annotate(sum_of_acres=Sum('acre')).order_by('crop__name', harvesting_date__month')

в шаблоне можно использовать regroup

Вернуться на верх