#django #django-rest-framework #django-orm
Вопрос:
Я создаю веб-страницу, на которой отображается «Канбан». У меня есть колонки, а также карточки.
Я хочу отфильтровать результаты в соответствии с полем (приоритет) в карточках (Продажа).
Мои модели:
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-фильтра для выполнения этой фильтрации. Мой набор взглядов:
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")
)
Как отфильтровать продажи в дополнение к столбцам?
Комментарии:
1. Как насчет замены
PipelineColumn.objects.all()
наPipelineColumn.objects.filter(sale_column__priority=2).annotate(total_ca=Sum("sale_column__expected_income")).annotate(percentage_ca=(Sum("sale_column__expected_income") * 100 / total)).prefetch_related("sale_column")
в вашемget_queryset
методе.2. Спасибо за ваш ответ, но я думаю, что вы не понимаете проблемы. Когда я
PipelineColumn.objects.all()
заменяюPipelineColumn.objects.filter(sale_column__priority=2)
его на фильтры столбцов, а не продаж.