That's not the "point" ;) discussed here... indeed the Book model (see
below) do get a pages_set including all pages of that book, the
problem discussed here is that the Book model can't declare the
"first" property because it references the Page model which is not yet
loaded by the interpreter. Reversing the order of the models wouldn't
change the situation because the Page model depends on the Book model.
I have been getting into similar problems when creating "join" models
to implement many-to-many relationships. Perhaps the problem below
could be solved by adding a "number" property to the Page model... but
if it was done this way (with first and next) there must be a reason
for it (perhaps is a dynamic book where pages can be added/delete at
any point).

class Book(db.Model):
        title = db.StringProperty()
        first = db.ReferenceProperty(Page)
class Page(db.Model):
        text = db.TextProperty()
        next = db.SelfReferenceProperty()
        book = db.ReferenceProperty(Book)

On Oct 16, 9:42 pm, Sudhir <[EMAIL PROTECTED]> wrote:
> If you add a reference to one model from the other, the other model
> automatically gets a back reference...
>
> class Point(db.Model):
>     """Store the map points"""
>     point = db.GeoPtProperty(required = True)
>     title = db.StringProperty(required = False)
>     owner =
> db.ReferenceProperty(Customer,collection_name='all_my_points')
>
> this lets me call customer.all_my_points, which returns an array of
> the point objects that are linked to that customer.
>
> The full scoop is 
> herehttp://code.google.com/appengine/docs/datastore/entitiesandmodels.htm...
>
> Sudhir
>
> On Oct 17, 6:13 am, Dado <[EMAIL PROTECTED]> wrote:
>
> > Let's say it can't be elegantly solved! ;)
>
> > On Oct 15, 9:46 pm, Andy Freeman <[EMAIL PROTECTED]> wrote:
>
> > > as yejun wrote up at the top, the following works, but doesn't verify
> > > that assignments to Book().first are instances of Page.
>
> > > class Book(db.Model):
> > >         title = db.StringProperty()
> > >         first = db.ReferenceProperty()  # note - no reference_class is
> > > specified
>
> > > class Page(db.Model):
> > >         text = db.TextProperty()
> > >         next = db.SelfReferenceProperty()
> > >         book = db.ReferenceProperty(Book)
>
> > > I don't understand very much about __metaclass__ processing, so there
> > > may be some way to define a metaclass for Book (probably involving a
> > > modified version of db.ReferenceProperty) that does provide this
> > > checking.  However, I'd be surprised if there was.
>
> > > On Oct 15, 7:18 pm, Dado <[EMAIL PROTECTED]> wrote:
>
> > > > Does that mean the aforementioned problem can't be solved?
>
> > > > On Oct 15, 12:33 pm, Andy Freeman <[EMAIL PROTECTED]> wrote:
>
> > > > > The problem really has nothing to do with how import works.  It's an
> > > > > execution order problem.
>
> > > > > Short version: yes, the problem is that Page doesn't exist when Book
> > > > > is defined.  However, it has nothing to do with imports.
>
> > > > > Long version:
>
> > > > > Import reads and executes statements from a file and makes the names
> > > > > defined by executing those statements available.
>
> > > > > Python's class definitions are actually executable statements.  (The
> > > > > organization ofhttp://docs.python.org/reference/reflectsthis
> > > > > reality.)
>
> > > > > A Python class statement executes some other statements in a context,
> > > > > some of which produce executable objects, applies some transformations
> > > > > to produce a class object, and binds that object to a variable,
> > > > > creating that variable if necessary.
>
> > > > > Python's executable objects can contain references to undefined
> > > > > things.  However, some of the db.Model transformations for
> > > > > db.ReferenceProperties depend on the specified reference_class (also a
> > > > > db.Model) having gone through that process previously.
>
> > > > > On Oct 15, 8:00 am, Dado <[EMAIL PROTECTED]> wrote:
>
> > > > > > Thanx for the clarification. I knew Python doesn't "import" like 
> > > > > > other
> > > > > > languages, and it is probably a more advanced solution. But doing it
> > > > > > the simpler way (Ruby?) allows for better file organization (for my
> > > > > > taste), with one file per model. I solved my problem by importing 
> > > > > > the
> > > > > > join model inside methods that use it, but it feels like a non-
> > > > > > efficient hack to me.
>
> > > > > > One question though. Is it right that the example shown in the first
> > > > > > post doesn't work because, the way Python "imports", Page doesn't 
> > > > > > yet
> > > > > > exists when referenced by Book?
>
> > > > > > Dado
>
> > > > > > On Oct 15, 5:47 am, Andy Freeman <[EMAIL PROTECTED]> wrote:
>
> > > > > > > Using multiple files for dbModel subclass definitions during
> > > > > > > development runs into the "GAE/python doesn't reload what hasn't
> > > > > > > changed" problem.
>
> > > > > > > If db.Model A is defined in fileA, db.Model B is defined in fileB 
> > > > > > > and
> > > > > > > B has a db.ReferenceProperty to A, B's definition will generate 
> > > > > > > errors
> > > > > > > when you change fileB and don't restart the development server.  
> > > > > > > Why?
> > > > > > > Because B's db.ReferenceProperty to A actually modifies A, and 
> > > > > > > that
> > > > > > > modification looks for conflicting modifications and can't 
> > > > > > > distinguish
> > > > > > > a conflicting modification from B's redefinition.  (Since fileA 
> > > > > > > hasn't
> > > > > > > changed, fileA won't be reloaded so A's previous definition will 
> > > > > > > still
> > > > > > > be around.)
>
> > > > > > > BTW, Python doesn't import classes.  The "import" statement 
> > > > > > > executes
> > > > > > > files and makes available a cached copy of the values computed 
> > > > > > > during
> > > > > > > the execution of said files.  The "from" form of the import 
> > > > > > > statement
> > > > > > > has some special risks and "from {file} import *" is typically 
> > > > > > > more
> > > > > > > trouble than it is worth.
>
> > > > > > > For how "fileA imports fileB and fileB imports fileA" works, 
> > > > > > > consult a
> > > > > > > Python reference.  It can be used to do certain things but not 
> > > > > > > others,
> > > > > > > and how it works depends on which file is imported first by some 
> > > > > > > other
> > > > > > > file.  If both fileA and fileB are imported by other files, 
> > > > > > > "first" in
> > > > > > > the development environment depends on which of them has changed. 
> > > > > > > If
> > > > > > > your application imports those other files depending on the 
> > > > > > > request,
> > > > > > > first also depends on request order.  (No, import and class
> > > > > > > definitions aren't special - they're just statements that get
> > > > > > > executed.)
>
> > > > > > > In general, you'll be happier if you avoid "fileA imports fileB 
> > > > > > > and
> > > > > > > fileB imports fileA".  It doesn't work like other languages that
> > > > > > > you've used before.  And, you were likely doing it in those other
> > > > > > > languages to do something that is best done some other way in 
> > > > > > > Python.
>
> > > > > > > Organize your inter and intra file dependencies in a DAG.  Use
> > > > > > > separate files for separatable "concepts".  If two concepts are
> > > > > > > mutually dependent, they're probably not separable.
>
> > > > > > > Concepts aren't classes.
>
> > > > > > > On Oct 14, 8:31 am, Dado <[EMAIL PROTECTED]> wrote:
>
> > > > > > > > I am having the same problem when defining a join model between 
> > > > > > > > two
> > > > > > > > models... because they "depend" on each other, but in my case 
> > > > > > > > is a
> > > > > > > > problem related to how Python "imports" classes (I am using 
> > > > > > > > "import"
> > > > > > > > to pull in models definitions that are in different files). 
> > > > > > > > Does the
> > > > > > > > code that you posted all reside in one file? Regardless, Python 
> > > > > > > > (I
> > > > > > > > think, but don't trust me on that) loads class and module 
> > > > > > > > definitions
> > > > > > > > as it reads (or import) the file, which means that when it first
> > > > > > > > encounters Book (with a Page ref in it) it doesn't know what 
> > > > > > > > Page is.
> > > > > > > > I haven't yet found a solution to this... please let me know if 
> > > > > > > > you
> > > > > > > > do.
>
> > > > > > > > On Oct 10, 1:06 pm, Andy Freeman <[EMAIL PROTECTED]> wrote:
>
> > > > > > > > > Yes, but then the db.ReferenceProperty won't verify that it's 
> > > > > > > > > being
> > > > > > > > > pointed to the right kind of thing.
>
> > > > > > > > > On Oct 9, 4:40 pm, yejun <[EMAIL PROTECTED]> wrote:
>
> > > > > > > > > > You don't have to give class for ReferenceProperty.
> > > > > > > > > > first = db.ReferenceProperty()
>
> > > > > > > > > > On Oct 9, 6:53 pm, acuth <[EMAIL PROTECTED]> wrote:
>
> > > > > > > > > > > Is it possible to have two models reference each other? I 
> > > > > > > > > > > can't get
> > > > > > > > > > > this to work and haven't been able to find this 
> > > > > > > > > > > limitation in the
> > > > > > > > > > > documentation. As a simple example, consider:
>
> > > > > > > > > > > class Book(db.Model):
> > > > > > > > > > >         title = db.StringProperty()
> > > > > > > > > > >         first = db.ReferenceProperty(Page)
>
> > > > > > > > > > > class Page(db.Model):
> > > > > > > > > > >         text = db.TextProperty()
> > > > > > > > > > >         next = db.SelfReferenceProperty()
> > > > > > > > > > >         book = db.ReferenceProperty(Book)
>
> > > > > > > > > > > which generates "NameError: name 'Page' is not defined" 
> > > > > > > > > > > when
> > > > > > > > > > > processing the Book class definition. Is this really a 
> > > > > > > > > > > limitation of
> > > > > > > > > > > the underlying data store or is it more related to how 
> > > > > > > > > > > models are
> > > > > > > > > > > defined in Python?
>
> > > > > > > > > > > I'm guessing the solution is to record the 'first page in 
> > > > > > > > > > > book'
> > > > > > > > > > > information as a separate class, for example:
>
> > > > > > > > > > > class FirstPage(db.Model):
> > > > > > > > > > >         book = db.ReferenceProperty(Book)
> > > > > > > > > > >         first = db.ReferenceProperty(Page)
>
> > > > > > > > > > > any pointers would be gratefully received, Adrian- Hide 
> > > > > > > > > > > quoted text -
>
> > > > > > > > > > - Show quoted text -- Hide quoted text -
>
> > > > > > > > - Show quoted text -- Hide quoted text -
>
> > > > > > - Show quoted text -- Hide quoted text -
>
> > > > - Show quoted text -
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To post to this group, send email to google-appengine@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to