Django-filter: JSONField dengan ModelMultipleChoiceFilter

Dibuat pada 11 Jul 2019  ·  2Komentar  ·  Sumber: carltongibson/django-filter

Halo.
Saya banyak membaca Masalah, tetapi saya tidak mengerti mengapa filter saya tidak berfungsi?
Saya punya model:

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

dan Filter

class ProductFilter(FilterSet):
    color = filters.ModelMultipleChoiceFilter(
        queryset=Product.objects.values_list('properties__color', flat=True).distinct(),
        field_name='properties',
        to_field_name='properties__color__contains',
        conjoined=True,
        )

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

barang saya

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

Tapi saya punya kueri SQL ini

SELECT ••• FROM "products_product" WHERE ("products_product"."properties" #> ARRAY['color','contains']) IN ('"Black"')

Jika saya mengubah ini:

to_field_name='properties__color'

Saya sudah:

SELECT ••• FROM "products_product" WHERE ("products_product"."properties" -> 'color') IN ('"Black"')

Dan saya memiliki Kesalahan: 'str' object has no attribute 'properties__color'
Bagaimana saya bisa memiliki:

SELECT ••• FROM "products_product" WHERE ("products_product"."properties" -> 'color') @> '"Black"'

Atau mungkin Anda memberi tahu saya apa kueri SQL yang lebih benar?
Jika saya menggunakan CharFilter ini:

color2 = filters.CharFilter(
        field_name='properties',
        lookup_expr='color__contains',
    )

Semua bekerja dengan baik, tetapi saya harus memilih lebih dari satu nilai filter ini.

Komentar yang paling membantu

Ada beberapa hal yang salah di sini

  • ModelMultipleChoiceFilter dimaksudkan untuk bekerja di kunci asing.
    Misalnya, temukan Article s dengan Tag s yang diberikan.
  • to_field_name dimaksudkan untuk sesuai dengan ForeignKey.to_field .
  • field_name seharusnya hanya berisi bidang model. lookup_expr harus berisi ekspresi pencarian (seperti contains ).

Sepertinya Anda mungkin ingin menggunakan AllValuesMultipleFilter , meskipun saya tidak sepenuhnya yakin apakah itu akan berfungsi dengan JSONField s. Mencoba:

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

Semua 2 komentar

Ada beberapa hal yang salah di sini

  • ModelMultipleChoiceFilter dimaksudkan untuk bekerja di kunci asing.
    Misalnya, temukan Article s dengan Tag s yang diberikan.
  • to_field_name dimaksudkan untuk sesuai dengan ForeignKey.to_field .
  • field_name seharusnya hanya berisi bidang model. lookup_expr harus berisi ekspresi pencarian (seperti contains ).

Sepertinya Anda mungkin ingin menggunakan AllValuesMultipleFilter , meskipun saya tidak sepenuhnya yakin apakah itu akan berfungsi dengan JSONField s. Mencoba:

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

Oh itu bekerja luar biasa, saya menghabiskan masalah ini tiga hari mencoba untuk menyelesaikan masalah ini.
Terima kasih banyak!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat