On Friday, December 29, 2017 at 6:16:04 AM UTC-8, Anthony wrote:
>
> You could do something like:
>
> query = (db.mytable.myfield.like('mytext,%') | # First item in list
> db.mytable.myfield.like('%,mytext,%') | # Neither first nor
> last item
> db.mytable.myfield.like('%,mytext') | # Last item in list
> db.mytable.myfield.like('mytext')) # Single item (no list)
>
> If you make sure to start and end every list (even single item lists) with
> a separater (e.g., ",a,b,c," instead of "a,b,c"), then you can simplify it
> to just:
>
> db.mytable.myfield.like('%,mytext,%')
>
> The above is how the DAL handles list:-type fields.
>
> Another alternative is a regexp search:
>
> db.mytable.myfield.regexp(r'\bmytext\b')
>
> The above will search for "mytext" between any word boundaries -- if the
> list items themselves might include word boundaries (e.g., spaces), then
> you'll need a more precise regular expression.
>
> Be careful about allowing arbitrary user input for a regexp query (see
> caution here:
> https://www.postgresql.org/docs/current/static/functions-matching.html).
>
> Anthony
>
Thank you. I can be picky about what characters are allowed in the
request, and the intended use won't be harmed by the restriction, so I may
go with the regex. (And a python regex to check the user input.)
/dps
>
> On Friday, December 29, 2017 at 3:24:10 AM UTC-5, Dave S wrote:
>>
>> I figured out how to iterate through request.vars to do a query with
>> multiple .contains(). Now I want to refine that further. Is there a
>> convenient way, when the field being queried is a "string list", to have
>> the contains match only on word boundaries, or do I have accept partial
>> matches and do further filtering on the results (the ROWS object).
>>
>> By "string list", I mean something similar to how list fields are
>> implemented for sqlite3 backends: the field itself is a string, and the
>> list elements are bounded by a separator. I'm using ',' instead of "|",
>> but you may consider that a quirk for now. If I'm searching for "bit", I
>> don't want "bitter" in the results.
>>
>> If I have to do further filtering, does filter() work on ROWS objects?
>>
>> BTW, I may later on replace this field with an official list-type field.
>> So of course I want deluxe solution that will continue work once I get
>> around to that.
>>
>> /dps
>>
>>
>>
>>
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.