Как фильтровать результаты и много детей?
Я делаю веб-страницу, которая отображает "Kanban". У меня есть столбцы, а также карточки.
Я хочу фильтровать результаты по полю (приоритет) в карточках (Продажа).
Мои модели:
class PipelineColumn(models.Model):
name = models.CharField(_("Name"), max_length=80)
order = models.PositiveIntegerField(_("Order of column"), unique=True)
default_probability = models.PositiveSmallIntegerField(_("probability"))
class Meta:
verbose_name = _("PipelineColumn")
verbose_name_plural = _("PipelineColumns")
ordering = ["order"]
def __str__(self):
return self.name
class Sale(models.Model):
name = models.CharField(_("name"), max_length=255)
expected_income = models.FloatField(_("expected income"))
probability = models.PositiveSmallIntegerField(_("probability"))
contact = models.ForeignKey(
"crm.Person",
verbose_name=_("person"),
related_name="sale_person",
on_delete=models.PROTECT,
)
date = models.DateField(_("date"), auto_now_add=True)
scheduled_closing_date = models.DateField(_("scheduled closing date"))
priority = models.PositiveSmallIntegerField(_("priority"), default=0)
column = models.ForeignKey(
"crm.PipelineColumn",
verbose_name=_("column"),
related_name="sale_column",
on_delete=models.CASCADE,
)
class Meta:
verbose_name = _("Sale")
verbose_name_plural = _("Sales")
ordering = ["scheduled_closing_date", "-priority"]
def __str__(self):
return self.name
Например, я хотел бы отобразить только те колонки и карточки, которые имеют приоритет 2. Если я пробую с PipelineColumn.objects.filter(sale_column__priority=2)
, то он хорошо фильтрует колонки, отображаются только колонки с продажами с приоритетом, равным 2. С другой стороны, в отображаемых колонках отображаются все продажи, даже те, приоритет которых не равен 2.
Я также хотел бы иметь возможность фильтровать продажи, возвращаемые моим запросом, и получать только те, приоритет которых равен 2.
На данный момент я использую модуль django-url-filter для этой фильтрации. Мой набор представлений:
class PipelineColumnViewSet(viewsets.ModelViewSet):
"""
A simple ViewSet for listing or retrieving PipelineColumn.
"""
permission_classes = [permissions.IsAuthenticated]
serializer_class = PipelineColumnSerializer
filter_backends = [
DjangoFilterBackend,
filters.SearchFilter,
filters.OrderingFilter,
]
search_fields = [
"sale_column__name",
"sale_column__contact__last_name",
"sale_column__contact__first_name",
]
filter_fields = ["is_done", "sale_column"]
ordering = ["order"]
def get_queryset(self):
total = PipelineColumn.objects.aggregate(
total=Sum("sale_column__expected_income")
)["total"]
return (
PipelineColumn.objects.all()
.annotate(total_ca=Sum("sale_column__expected_income"))
.annotate(percentage_ca=(Sum("sale_column__expected_income") * 100 / total))
.prefetch_related("sale_column")
)
Как фильтровать продажи в дополнение к столбцам?