Как отфильтровать объединенное значение при использовании таблиц django2 и django_filters

Я использую django table2 и django_filters для фильтрации полей значений, находящихся в таблице.

мои модели:

class Woo_Orders(models.Model):
    oid = models.IntegerField("oid",null=True)
    site=models.ForeignKey(Site, null=True,blank=True,verbose_name="Site", on_delete = models.CASCADE)

class Site(models.Model):
    ref_prefix = models.CharField(max_length=20, blank=True, null=True,verbose_name="REF")

Модель Site соответствует модели Woo_Orders.

мой стол:

class WooOrderTable(tables.Table):
ref_prefix = tables.Column(accessor='site.ref_prefix',verbose_name= 'Ref Prefix')

class Meta:
        model = Woo_Orders
        template_name = 'django_tables2/bootstrap4.html'
        exclude = (...,...)
        sequence = ('ref_prefix',...,...)


def render_ref_prefix(self,record):
        #site prefix + oid
        concatenated_prefix = record.site.ref_prefix + str(record.oid)
        return '%s' % (concatenated_prefix)

Возвращаемое значение представляет собой объединенное значение oid из модели Woo_Orders плюс значение ref_prefix из модели Site.

Моя проблема в том, что я не знаю, как вернуть объединенное значение при фильтрации по полю ref_prefix.

мой фильтр:

class WooOrderFilter(django_filters.FilterSet):
   site__ref_prefix = django_filters.CharFilter(lookup_expr='icontains')

class Meta:
        model = Woo_Orders
        fields = ['site__ref_prefix']

Фильтр «улавливает» только часть ref_prefix модели Site, а не все конкатенированное значение, как я хочу.

Как я могу исправить часть фильтра для поиска на основе объединенного значения?


person gtopal    schedule 21.05.2020    source источник
comment
Наконец я нашел решение.   -  person gtopal    schedule 10.06.2020


Ответы (1)


Наконец я нашел решение.

Я должен объявить в файле filter.py мое пользовательское поле столбца следующим образом:

site__ref_prefix = django_filters.CharFilter(label = "Site Prefix",method='my_custom_filter')

и помимо этого объявить метод, отвечающий за фильтрацию.

class Meta:
        model = Woo_Orders
        fields = ['site__ref_prefix']

def my_custom_filter(self, queryset, name, site__ref_prefix):
        qs = Woo_Orders.objects.all()
        return qs.filter(Q(site__name__istartswith=site__ref_prefix) | Q(site__name__icontains=site__ref_prefix))
person gtopal    schedule 10.06.2020