andrew
andrew

Reputation: 1

Some other filter

I have a problem. I've got a string which looks like "var1,var2" and table in database which contains some records looks like "var1, var3", "var3", "var2,var3" an I want to filter them by splitting first string. When any of my string-variable fits to database-variable django will display them. So, when I have string-var like this:"var1,var2" and database-variables like: "var1,var3", "var3", "var2,var3" django will display "var1,var3", "var2,var3". How can I do that? When I straightly filter by Data.objects.filter, Django displays only that records who contains all of string-variables.

Sorry for my poor English, hope everyone understood. Cheers.

Upvotes: 0

Views: 91

Answers (2)

Jj.
Jj.

Reputation: 3160

I htink that what you want is OR lookups. Try this:

var_string = 'var1,var2'
vars = var_string.split(',')

result = MyModel.objects.none()

for var in vars:
  result |= MyModel.objects.filter(name__icontains=var.strip())

return result

You might want to put this in a Manager for reusability. But personally, I'd try to find out why are names stored like that on the database and fix that.

Upvotes: 2

Seth
Seth

Reputation: 46423

Rather than this approach, you might have better luck adding a foreign key or a grouping number to your model so you can use the Database to do the splitting for you.

So instead of this:

class MyModel(models.Model): 
    vars = models.CharField(max_length=200)

m = MyModel(vars="var1,var2")
m.save()
m = MyModel(vars="var2,var3")
m.save()

Do this:

class MyModel(models.Model):
    group = models.IntegerField()
    var = models.CharField(max_length=200)

m = MyModel(group=1, var="var1")
m.save()
m = MyModel(group=1, var="var2")
m.save()

m = MyModel(group=2, var="var2")
m.save()
m = MyModel(group=2, var="var3")
m.save()

Then you can query like this:

MyModel.objects.filter(group=1)

Or like this:

MyModel.objects.filter(var="var1")

Upvotes: 0

Related Questions