Как фильтровать результаты и много детей?

Я делаю веб-страницу, которая отображает "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")
        )

Как фильтровать продажи в дополнение к столбцам?

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