Как предотвратить дублирование при использовании ModelChoiceFilter в фильтрах Django и Wagtail - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь использовать фильтры с моделью Wagtail Page и моделью Orderable.Но теперь я получаю дубликаты в моем фильтре.Как я могу решить что-то вроде этого?

Мой код:

class FieldPosition(Orderable):
    page                        = ParentalKey('PlayerDetailPage', on_delete=models.CASCADE, related_name='field_position_relationship')
    field_position              = models.CharField(max_length=3, choices=FIELD_POSITION_CHOICES, null=True)

    panels = [
        FieldPanel('field_position')
    ]

    def __str__(self):
        return self.get_field_position_display()



class PlayerDetailPage(Page):
    content_panels              = Page.content_panels + [
                                                        InlinePanel('field_position_relationship', label="Field position", max_num=3),
    ]


class PlayerDetailPageFilter(FilterSet):
    field_position_relationship          = filters.ModelChoiceFilter(queryset=FieldPosition.objects.all())

    class Meta:
        model = PlayerDetailPage
        fields = []

Так что я пытаюсь сделать, это создать фильтр, который использует записи из FIELD_POSITION_CHOICES для фильтрации любой страницыэта позиция объявлена ​​на встроенной панели в Wagtail.

Как вы можете видеть на картинке внизу, фильтры просматриваются и страница отображается.(Это 2 страницы со списком из 3 позиций на местах).

enter image description here

Таким образом, на странице 1 и странице 2 есть запись "Left Winger", поэтому в раскрывающемся списке она равна двойной.Фильтрация работает отлично.

Что я могу сделать, чтобы предотвратить это?

Решение должно быть примерно таким (Кредиты для Харриса для этого):

У меня в основном есть один FieldPosition объект на позицию поля страницы, поэтому он перечисляет все объекты правильно.Я подозреваю, что я не должен использовать там средство выбора модели, а список жестко закодированных значений в FIELD_POSITION_CHOICES и затем фильтр для выполнения запроса, который выглядит примерно как PlayerDetailPage.objects.filter(field_position_relationship__field_position=str_field_position_choice).Но как это сделать с помощью фильтра Джанго?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Я нашел решение после некоторых проб и ошибок:

Фильтр:

class PlayerDetailPageFilter(FilterSet):
    field_position_relationship__field_position     = filters.ChoiceFilter(choices=FIELD_POSITION_CHOICES)

    class Meta:
        model = PlayerDetailPage
        fields = []

И затем вид просто так:

context['filter_page'] = PlayerDetailPageFilter(request.GET, queryset=PlayerDetailPage.objects.all()

При доступеfield_position через связанное имя ParentalKey field_position_relationship с __.

Затем, используя фильтр Django ChoiceFilter, теперь я получаю все жестко запрограммированные записи из списка выбора и сравниваю их сзаписи в наборе запросов PlayerDetailPage.

В шаблоне я могу получить список, используя метод Django Filter, а затем просто выполнить цикл запроса:

<form action="" method="get">

{{ filter_page.form.as_p }}

<input type="submit" />
</form>

{% for obj in filter_page.qs %}
{{ obj }} >
{% endfor %}
0 голосов
/ 25 апреля 2019

Raf

В моем ограниченном упрощенном виде это выглядит как

class PlayerDetailPageFilter(FilterSet):
    field_position_relationship = filters.ModelChoiceFilter(queryset=FieldPosition.objects.all())

собирается вернуть все объекты из FieldPosition, и если у вас есть 2 записи для «левого крыла» здесь (одна для страницы 1 и одна для страницы 2), то будет иметь смысл, что это дублирует ваш список. Итак, вы пытались отфильтровать этот набор запросов списка с помощью .distinct? Возможно, что-то вроде

class PlayerDetailPageFilter(FilterSet):
    field_position_relationship = filters.ModelChoiceFilter(queryset=FieldPosition.objects.values('field_position').distinct())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...