Вложенный запрос на основе 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