Re: [SQLObject] One-to-one relationships
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: Sam N. <sa...@se...> - 2005-03-08 22:52:58
|
Gonzalo Sainz-Tr=E1paga wrote: > Hi again, > I've got a new problem with my model definitions. > I have a "User" class and a "Person" class. I want to keep them > separated because not all of the site's users are really Persons from > the organization point of view - other people who have users are not > registered as Persons (the root user, or maintenance users for employee= s > that need to upload stuff to my site). >=20 > The "Person" is then the entity that is related to the rest of the data= , > and the "User" is mostly the login-and-id related data. > I want to be able to link a "Person" object to a "User" one directly. A= s > i said, not all Users are a Person, so I want to have the ability to > leave User.Person null. >=20 > From rom what i've read this is what you call "inheritance", but the FA= Q is > not very clear on the subject and the solution proposed seems to fulfil= l > particular needs that i don't have. >=20 > I can always have a unique table with user-data and person-data on it, > just leaving the Person-type data blank when the user is not a Person, > but i would like to avoid this. >=20 > Any suggestions? If you don't need the inheritance functionality, then no need to use it.=20 For my stuff (so far at least), I haven't felt the need for inheritance,=20 so I haven't checked it out, and I can't say how it works. Assuming that=20 you don't need inheritance, try this: class Person(SQLObject): myVar1 =3D StringCol() myVar2 =3D StringCOl() ... user =3D ForeignKey('User', default=3DNone) class User(SQLObject): myVar1 =3D StringCol() myVar2 =3D StringCOl() ... person =3D ForeignKey('Person', default=3DNone) This way, a user doesn't have to have (be) a person, and a person=20 doesn't have to have (be) a user, but they can! There is one extra step=20 with this method. You have to set the foreign key in both objects, not=20 just one, like this: user.person =3D myPerson # now we have proper mapping from user to person person.user =3D user # now we have reverse mapping from person to user You could also do this with MultipleJoins or RelatedJoins, but since you=20 have a 1:1 mapping, you don't need to. I recommend hanging out on the sqlobject documentation web page, reading=20 and rereading it. This is all covered (more or less), it just takes time=20 to sink in. Also, lurn on SQL logging and read the sql output that is=20 produced when you get/create/modify/delete/search sqlobject objects. At=20 least, that is what has helped me ;-). Peace - Sam |