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.
Ada beberapa hal yang salah di sini
ModelMultipleChoiceFilter
dimaksudkan untuk bekerja di kunci asing.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!
Komentar yang paling membantu
Ada beberapa hal yang salah di sini
ModelMultipleChoiceFilter
dimaksudkan untuk bekerja di kunci asing.Misalnya, temukan
Article
s denganTag
s yang diberikan.to_field_name
dimaksudkan untuk sesuai denganForeignKey.to_field
.field_name
seharusnya hanya berisi bidang model.lookup_expr
harus berisi ekspresi pencarian (seperticontains
).Sepertinya Anda mungkin ingin menggunakan
AllValuesMultipleFilter
, meskipun saya tidak sepenuhnya yakin apakah itu akan berfungsi denganJSONField
s. Mencoba: