wrong record getting selected in recursive select

43 views
Skip to first unread message

@brooks

unread,
Sep 1, 2016, 2:47:55 PM9/1/16
to web2py-users
So my question goes as follows:
#################models/db1.py
               
db.define_table('Restaurant',
                Field('Name',unique=True),
..................................................
.......................auth.signature,format='%(Name)s')

db.define_table('Menu',
                Field('menu','upload'),
                Field('restaurant','reference Restaurant',writable=False))


############controller/func()
indices=db(db.Menu).select()
for index in indices:
    t=db(index.restaurant.Name==request.args[0]).select(db.Menu.ALL).first()
            if t:
                record=db.Menu(t.id)
                form=SQLFORM(db.Menu,record).process()
......................................................................
.....................................................................

(I have one record in the Menu table now)
The question is that the first record gets selected even if the condition is not true.I do not understand it.Please tell me what I am doing wrong.Any help is appreciated.

Regards,
Brooks

Dave S

unread,
Sep 1, 2016, 3:24:26 PM9/1/16
to web2py-users

I dunno, but I get a syntax error trying to translate your for ... select into something I can try with -S and my tables.  Is db(<ROW object>) meaningful?

/dps

brooks lee

unread,
Sep 2, 2016, 12:48:06 AM9/2/16
to web...@googlegroups.com
The extra space before "if t:" must have caused the syntax error.Sorry,my bad.The code with the correct syntax is as follows:

#################models/db1.py
               
db.define_table('Restaurant',
                Field('Name',unique=True),
..................................................
.......................auth.signature,format='%(Name)s')

db.define_table('Menu',
                Field('menu','upload'),
                Field('restaurant','reference Restaurant',writable=False))



###########controller/func()
indices=db(db.Menu).select()
for index in indices:
    t=db(index.restaurant.Name==request.args[0]).select(db.Menu.ALL).first()
    if t:
        record=db.Menu(t.id)
        form=SQLFORM(db.Menu,record).process()
......................................................................
.....................................................................


Regards,
Brooks

--
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 a topic in the Google Groups "web2py-users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/web2py/E4VyjG0jS94/unsubscribe.
To unsubscribe from this group and all its topics, send an email to web2py+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Anthony

unread,
Sep 2, 2016, 9:21:21 AM9/2/16
to web2py-users
indices=db(db.Menu).select()
for index in indices:
    t=db(index.restaurant.Name==request.args[0]).select(db.Menu.ALL).first()

Above, index.restaurant.Name is simply a string value (the name of the restaurant in question), as is request.args(0). Therefore, index.restaurant.Name==request.args(0) is not a DAL Query object but simply a standard Python boolean that is either True or False. Regardless of the value of that boolean, the results of the query will be the same -- all records from db.Menu will be selected.

Perhaps you can explain what you are trying to achieve here.

Anthony

brooks lee

unread,
Sep 2, 2016, 2:27:23 PM9/2/16
to web...@googlegroups.com
I want to  select those records in the Menu table such that the name of the restaurant with id in the Menu.restaurant field ==request.args(0).So,what should be the DAL query here?


--

Anthony

unread,
Sep 3, 2016, 10:28:56 AM9/3/16
to web...@googlegroups.com
If you mean that request.args(0) contains the name of the restaurant, then you need a join:

t = db((db.Menu.Restaurant == db.Restaurant.id) &
       
(db.Restaurant.name == request.args(0))).select(db.Menu.id).first()

Note, in that case, the Menu id will be in t.Menu.id rather than just t.id.

You can also use a reverse recursive select (which will result in two queries rather than just one):

t = db.Restaurant(name=request.args(0)).Menu.select(db.Menu.id).first()

Another way to do the same would be:

t = db.Menu(restaurant=db.Restaurant(name=request.args(0)).id)

A simpler option might be to make request.args(0) be the id of the restaurant instead of the name -- then you can just do:

t = db.Menu(restaurant=request.args(0))

Finally, if each restaurant has only one menu, then why not just move the menu field(s) into the Restaurant table?

Anthony

brooks lee

unread,
Sep 4, 2016, 4:02:18 PM9/4/16
to web...@googlegroups.com
Thanks a lot!

On Sat, Sep 3, 2016 at 7:58 PM, Anthony <abas...@gmail.com> wrote:
If you mean that request.args(0) contains the name of the restaurant, then you need a join:

t = db((db.Menu.Restaurant == db.Restaurant.id) &
       
(db.Restaurant.name == request.args(0))).select(db.Menu.id).first()

Note, in that case, the Menu id will be in t.Menu.id rather than just t.id.

You can also use a reverse recursive select (which will result in two queries rather than just one):

t = db.Restaurant(name=request.args(0)).Menu.select(db.Menu.id).first()

Reply all
Reply to author
Forward
0 new messages