如何过滤Django的CommaSeparatedIntegerField

Bol*_*wyn 5 django field filter django-models

假设一个模型

class Foo(models.Model):
    bar = models.CommaSeparatedIntegerField('Filter Me!')
Run Code Online (Sandbox Code Playgroud)

bar例如,内容可能看起来像12,35,67,142.

我想查询所有Foo的时候,那些有42bar:

all_42_foos = Foo.objects.filter(bar__contains="42")
Run Code Online (Sandbox Code Playgroud)

因为CommaSeparatedIntegerField继承自CharField,并且过滤器评估使用字段的字符串内容(也与上面的示例匹配),因此不会给出正确的结果142.

我怎么能有一个过滤器,它在检查之前.split(",")bar现场做了42?我真的不想bar成为一个ManyToMany,因为它是一个可怕的开销.

des*_*ido 13

怎么样的:

from django.db.models import Q

all_42_foos = Foo.objects.filter( Q(bar__startswith='42,') | Q(bar__endswith=',42') | Q(bar__contains=',42,') | Q(bar__exact='42') )
Run Code Online (Sandbox Code Playgroud)

虽然这是一个冗长的查询,我认为沿着这些方向的东西将是获得你正在寻找的东西的唯一方法.可能值得把它变成一个单独的功能

def all_x_foos(x):
    return Foo.objects.filter( Q(bar__startswith=x+',') | Q(bar__endswith=','+x) | Q(bar__contains=',{0},'.format(x)) | Q(bar__exact=x) )
Run Code Online (Sandbox Code Playgroud)

出于好奇,您是否已经使用多对多方式检查应用程序的实际性能,以及您描述的伪多对多方法?