I defined two models:
class Server(models.Model): owners = models.ManyToManyField('Person') class Person(models.Model): name = models.CharField(max_length=50) admin.site.register(Server) admin.site.register(Person)
After that I even checked the sql, just for fun:
BEGIN; CREATE TABLE "servers_server_owners" ( "id" integer NOT NULL PRIMARY KEY, "server_id" integer NOT NULL, "person_id" integer NOT NULL, UNIQUE ("server_id", "person_id") ) ; CREATE TABLE "servers_server" ( "id" integer NOT NULL PRIMARY KEY, "name" varchar(50) NOT NULL, "port" integer unsigned NOT NULL, "state" integer NOT NULL ) ; CREATE TABLE "servers_person" ( "id" integer NOT NULL PRIMARY KEY, "name" varchar(50) NOT NULL ) ; COMMIT;
There it even says
CREATE TABLE "servers_server_owners"
syncdb to install the new models to the database. I went to the admin-interface to define some objects to play with, but I got the following error:
DatabaseError at /admin/servers/server/1/ no such table: servers_server_owners
I shutdown the dev-server, ran
syncdb again, started the server: Still same problem. Why can't it find, the table, even though it just told me it created id?
Actually the problem was that the table never got created. Since I am fairly new with django, I did not know that
./manage.py syncdb does not update existing models, but only creates the ones that do not exist.
Because the model 'Server' existed before I added the other model, and it was already in the db, 'syncdb' did not actually create the new tables.
As a tip for the future, look into South, a very useful utility for applying your model changes to the database without having to create a new database each time you've changed the model(s).
With it you can easily:
python manage.py migrate app_name and South will write your model changes.
The documentation is pretty straightforward.