I have a better solution:

>>> class A(int): pass
>>> x=A(100)
>>> print x
100
>>> x+40
140
>>> isinstance(x,int)
True

Yet x in an object and can have attributes. We can define a new class
that works like and the reference id belongs to this class.  When you
request an attribute of it, you get the attribute of the record. The
SQL select would be done only on demand and cached by object so the
values are there if needed again.

This may be a bit tricky with the new API that allow reference by non-
id primary key.

Massimo


On Oct 27, 11:29 am, Thadeus Burgess <[email protected]> wrote:
> I would like this.
>
> select_refs would get passed to the select() function, this way I did not
> have to write a join.
>
> Perhaps it could be called join_foreign, defaulted to False
>
> Say a student is assigned to a teacher.
>
> db(db.students.student_id==1102926).select(foreignkey_join=True)
>
> yeilds
>
> student.id student.name student.email student.phone
> student.teacher.namestudent.teacher.room_number
>
> and
>
> db(db.students.student_id==1102926).select()
>
> yeilds where student.teacher is the id.
>
> student.id student.name student.email student.phone student.teacher
>
> This also allows us to expand to provide auto many-to-many joins as well.
> This would help add more of an ORM aspect to our DAL without losing any of
> the sweetness of the DAL.
>
> -Thadeus
>
> On Tue, Oct 27, 2009 at 11:21 AM, mr.freeze <[email protected]> wrote:
>
> > Too bad, other DAL/ORMs have this. SQLAlchemy calls it a backref and
> > django calls it a reverse foreign key manager.  What if Field had a
> > 'select_refs=False' attribute so it was configurable?
>
> > On Oct 27, 7:32 am, mdipierro <[email protected]> wrote:
> > > This is not backward compatible, it also make a hidden select every
> > > time you access a record. So if you select 100 records that have
> > > reference and loop over them, you'd be making 100 additional selects.
> > > If this is what you want to do, I think it is better to be explicit or
> > > do a join.
>
> > > On Oct 27, 1:43 am, "mr.freeze" <[email protected]> wrote:
>
> > > > I made a simple patch that lets this work and is seemingly backwards
> > > > compatible (didn't break my apps anyway).  It basically automatically
> > > > does a select for any reference fields so you can do this (db.things
> > > > has a reference field 'author' to auth_user in this example):
>
> > > > record = db(db.things.id==1).select()[0]
> > > > print record.author.email
>
> > > > What do you think?
>
> > > > ### Eclipse Workspace Patch 1.0
> > > > #P web2py
> > > > Index: gluon/sql.py
> > > > ===================================================================
> > > > --- gluon/sql.py        (revision 1310)
> > > > +++ gluon/sql.py        (working copy)
> > > > @@ -451,6 +451,8 @@
> > > >              else:
> > > >                  return "'F'"
> > > >      if fieldtype[0] == 'i':
> > > > +        if isinstance(obj,DALStorage):
> > > > +            return str(int(obj.id))
> > > >          return str(int(obj))
> > > >      elif fieldtype[0] == 'r':
> > > >          if fieldtype.find('.')>0:
> > > > @@ -2926,7 +2928,7 @@
> > > >              if field.type[:10] == 'reference ':
> > > >                  referee = field.type[10:].strip()
> > > >                  rid = value
> > > > -                row[tablename][fieldname] = rid
> > > > +                row[tablename][fieldname] = self._db(self._db[referee]
> > > > ['id']==rid).select()[0]
> > > >              elif field.type == 'blob' and value != None:
> > > >                  row[tablename][fieldname] = base64.b64decode(str
> > > > (value))
> > > >              elif field.type == 'boolean' and value != None:
>
> > > > On Oct 26, 11:47 pm, "mr.freeze" <[email protected]> wrote:
>
> > > > > Also, why doesn't this work?:
>
> > > > > record = db(db.tablename.id==1).select()[0]
> > > > > print record.author.email
>
> > > > > It seems like it should work since author is a reference to auth_user
> > > > > and it's referencing a distinct record.
>
> > > > > On Oct 26, 11:25 pm, mdipierro <[email protected]> wrote:
>
> > > > > > Given:
>
> > > > > > ... Field("author", db.auth_user, default=auth.user.if if auth.user
> > > > > > else 0) ...
>
> > > > > > db.tablename.author.requires=IS_IN_DB(db,'auth_user.id
> > ','%(first_name)
> > > > > > s %(last_name)s')
>
> > > > > > You can do
>
> > > > > > record = db(db.tablename.id>0).select().first()
> > > > > > print db.auth_user[record.author].first_name
>
> > > > > > and/or
>
> > > > > > row= db(db.tablename.author==db.auth_user.id).select.first()
> > > > > > print row.tablename, row.auth_user.first_name
>
> > > > > > On Oct 26, 10:58 pm, Wiiboy <[email protected]> wrote:
>
> > > > > > > And then how would I get the user's info?
>
> > > > > > > db(db.auth_user.id == db.tablename.author)
>
> > > > > > > ?
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/web2py?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to