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?

Я пытался:

  1. queryset.filter(products__contain=value), но получил django.core.exceptions.FieldError: Unsupported lookup 'contain' for ForeignKey or join on the field not permitted. Это может быть потому, что я на SQLite.
  2. использую Q и regex: queryset.filter(Q(data__regex=r'"name":.*"test"')), но это всегда приводит к пустым наборам запросов. Мне больше понравилась идея regex, потому что она нечувствительна к элементам data, которые могут не содержать ключ name.
Вернуться на верх