Found explanation in :
http://web2py.com/books/default/chapter/29/06/the-database-abstraction-layer?search=._select%28%29

On Thursday, December 15, 2016 at 6:16:46 PM UTC+1, Anthony wrote:
>
> Looks like your current validator will not allow a category to be used 
> twice in the entire item_category table, which is not consistent with a 
> many-to-many relationship. Is that your intention? Or do you instead want 
> to ensure that there are no duplicate item/category *combinations* in the 
> item_category table. If the latter, you can do something like the 
> following, which will not only provide the proper validation, but will also 
> limit the list of categories in the select widget to those that have not 
> already been paired with the current item:
>
> def show_grid():
>     if 'item_category.item' in request.args:
>         item_id = int(request.args[request.args.index('item_category.item'
> ) + 1])
>         used_categories = db(db.item_category.item == item_id)._select(db.
> item_category.category)
>         available_categories = db(~db.category.id.belongs(used_categories
> ))
>         db.item_category.category.requires = IS_IN_DB(available_categories
> , 'category.id', '%(name)s')
>     grid = SQLFORM.smartgrid(db.item)
>     return dict(grid=grid)
>
> In smartgrid, when you are viewing item-categories for a given item, 
> request.args will include "item_category.item", with the immediately 
> following arg being the id of the item being viewed. So, in the above code, 
> item_id is the id of the specific item in question. use_categories is a 
> query that determines which categories have already been paired with this 
> item in the item_categories table. It uses ._select so it can be passed 
> to .belongs as a subquery. available_categories is a Set object that 
> identifies categories that have *not* been paired with the current item 
> in item_categories. When you pass a Set object to IS_IN_DB, it restricts 
> values to records that are in the Set, so the validator will only allow 
> (and display in the form) categories not already assigned to the item.
>
> Anthony
>
> On Wednesday, December 14, 2016 at 5:31:11 PM UTC-5, icodk wrote:
>>
>> I have  an item ,category and item_category  tables facilitating many to 
>> many relations between items and categories, which enables an item to 
>> belongs to  several categories. I use SQLSmartgrid to show the 
>> item_category  table and to add categories to specific item. This all works 
>> well. I can even managed to get an error if I select an already selected 
>> category by using the following:
>>
>> db.item_category.category.requires = IS_IN_DB(db, 'category', '%(name)s', 
>> _and=IS_NOT_IN_DB(db, 'item_category.category', error_message=T('This 
>> category already assigned')), zero=None)
>>
>>
>> So what more could I wish ?
>>
>> It would be nice if the category dropdown list I get when adding or editing 
>> category to an item would contains only the categories not yet assigned to 
>> the item I am working on
>>
>> At the moment I get a list with  all categories, however selecting an 
>> existing category correctly give me an error as described above.
>>
>>
>>

-- 
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.

Reply via email to