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 web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to