SimpleListFilter и поля M2M в формате JSON
Моя установка содержит информацию о продукте, которая поступает из JSON-поля и связана со страницей в m2m-отношении (страница как в каталоге).
class Page(models.Model):
...
products = models.ManyToManyField(Product, related_name="%(class)s_name", related_query_name="product_page_qs", blank=True)
class Product(models.Model):
...
number = models.PositiveIntegerField()
data = models.JSONField()
Я создал SimpleListFilter
с текстовым поиском, чтобы получить список всех страниц, содержащих заданный продукт (работает просто отлично):
class PageProductSearch(admin.SimpleListFilter):
title = "product"
parameter_name = "product"
template = "search_filter.html"
def lookups(self, request, model_admin):
return ((None, None),)
def choices(self, changelist):
super().choices(changelist)
return (*self.lookup_choices,)
def queryset(self, request, queryset):
value = self.value()
if value:
return queryset.filter(products=value)
Моя проблема заключается в том, что для поиска товаров мне необходимо знать product.id
. Как я могу расширить фильтрацию набора запросов, чтобы искать ключ в jsonField
?
Я пытался:
queryset.filter(products__contain=value)
, но получилdjango.core.exceptions.FieldError: Unsupported lookup 'contain' for ForeignKey or join on the field not permitted.
Это может быть потому, что я на SQLite.- использую
Q
иregex
:queryset.filter(Q(data__regex=r'"name":.*"test"'))
, но это всегда приводит к пустым наборам запросов. Мне больше понравилась идеяregex
, потому что она нечувствительна к элементамdata
, которые могут не содержать ключname
.