Как использовать ModelMultipleChoiceFilter в django_filters с JSONfield - PullRequest
1 голос
/ 09 июля 2019

Я пытаюсь фильтровать элементы, используя django_filters с JSONfield в моей модели, но я не могу этого сделать.

Если использовать CharFields, я могу получить текущий результат,но мне нужно иметь возможность работать с запросами.
Когда я использую ModelMultipleChoiceFilter, я получаю все варианты от фильтра, но фильтрация не происходит.

Models.py

class Product(models.Model):
    name = models.CharField(max_length=120)
    properties = JSONField(default=dict, blank=True, null=True, db_index=True)

Filters.py

from django_filters.rest_framework import FilterSet
from django_filters import rest_framework as filters
from products.models import Product

class ProductFilter(FilterSet):
    color = filters.ModelMultipleChoiceFilter(
        queryset=Product.objects.extra(
        select={'color': "properties->>'color'"}).values_list('properties__color', 
                                                             flat=True).distinct(), 
        field_name='properties', 
        to_field_name='properties',
        lookup_expr='color__contains', 
        )

    class Meta:
        model = Product
        fields = {
            'color': 'color__contains',
        }

This is Item

{
    "id": 10,
    "name": "Test_3",
    "properties": {
        "color": "Black",
        "invertor technology": false,
        "service area, m²": 24
    },
},

Если я выберу в фильтре цвет Черный,
У меня есть эта ошибка: Выберите правильный вариант.Черный не входит в число допустимых значений.

1 Ответ

0 голосов
/ 11 июля 2019

Получилось очень просто, просто пришлось использовать AllValuesMultipleFilter

class ProductFilter(FilterSet):
    color = filters.AllValuesMultipleFilter(
        field_name='properties__color',
        lookup_expr='contains,
    )

Большое спасибо rpkilby . Ссылка выпуск .

...