On Sat, Jan 3, 2009 at 3:01 AM, adrian <adrian...@gmail.com> wrote:
>
>
> I happen to have a bunch of models that all have foreign keys, but
> there is an order in which they could all be initialized.   I have
> figured out how to initialize the built-in User model using Json data,
> but I can't initialize any models that refer to it using a foreign
> key.  Is this possible and if so how?

Yes, it is possible. If you have a model something like:

class Person(Model):
   user = ForeignKey(User)
   name = CharField(...)

this will serialize something like:

{
    "model": "myapp.person',
    "pk": 1,
    "fields": {
        "user": 3,
        "name": "Fred"
    }
}

The reference to a user is just the primary key of the object you want
to refer to. If you want a more comprehensive example using your own
models, try creating some instances using the Python API, then use the
manage.py dumpdata command to produce sample fixtures.

Generally speaking, you don't need to worry about the order of
initialization. In your fixture, you can define the Person then the
User, or the User and then the Person - it doesn't matter.

If you're using SQLite or MySQL with MyISAM tables, there is no
referential integrity to worry about, so you can create a Person that
refers to a User that doesn't exist yet. As long as you eventually
create the User, you won't have any problems.

If you're using Postgres, all the fixtures are loaded in a
transaction, and referential integrity isn't checked until the end of
the transaction. As long as the Person and the User are both loaded at
the end of fixture loading, the order in which they are created
doesn't matter.

The only exception to this rule is MySQL with InnoDB tables - which,
because of its retarted referential integrity, insists on checking
references at the end of every commit, rather than at the end of the
transactional block. This means that you have to manually check that
the fixture with an ordering such that the User is loaded before the
Person.

Until MySQL fixes its referential integrity rules for InnoDB, this
limitation can't be avoided in the general case. Any form of circular
reference between models will always pose difficulties - there is no
way to provide an ordering that is guaranteed to load successfully.

Yours,
Russ Magee %-)

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to