How would you enable/disable the functionality? Like you said, for some queries, you would not want to get the references.
-Thadeus On Tue, Oct 27, 2009 at 12:48 PM, mdipierro <[email protected]> wrote: > > exactly as you suggested, you can do: > > record = db(db.tablename.id==1).select()[0] > print record.author.email > > but > > print record.author > > is an integer. > > On Oct 27, 12:46 pm, "mr.freeze" <[email protected]> wrote: > > Can you give an example of the usage? > > > > On Oct 27, 11:43 am, mdipierro <[email protected]> wrote: > > > > > Something like this? > > > > > >>> class DALRef(int): > > > > > ... def __init__(self,table,value): > > > ... int.__init_(self,value) > > > ... self._table=table > > > ... self._record=None > > > ... def __getattr__(self,key): > > > ... if not self._record: > > > ... self._record=self._table[int(self)] > > > ... return self._record[key] > > > > > and in sql.py > > > > > row[tablename][fieldname] = DALRef(self._db[referee],rid) > > > > > On Oct 27, 11:37 am, mdipierro <[email protected]> wrote: > > > > > > 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 -~----------~----~----~----~------~----~------~--~---

