我正在使用django tables2和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")
The Site
是fk到 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
模型,而不是我想要的所有连接值。
我怎么能把过滤部分修复成基于连贯值的搜索?
最后我找到了解决方案。
我必须在 filters.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))