Assume a model
class Foo(models.Model):
bar = models.CommaSeparatedIntegerField('Filter Me!')
The content of the bar could look like, e.g., 12,35,67,142.
I want to query all Foos, that have a 42 in bar:
all_42_foos = Foo.objects.filter(bar__contains="42")
which doesn't give the correct result, since CommaSeparatedIntegerField inherits from CharField and the filter evaluation uses the string content of the field (matching the above example with 142, too).
How can I hav a filter, that does a .split(",") on the bar field before it checks for the 42? I really don't want bar to become a ManyToMany, since it'd be a terrible overhead.
What about something like:
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') )
While it's a bit of a verbose query, I think something along those lines will be the only way to get what you're looking for. It's probably worth turning that into a separate function along the lines of
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) )
Out of curiosity, have you checked the actual performance of your app w/ both the many-to-many way, and the pseudo-many-to-many method you're describing?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With