id,summary,reporter,owner,description,type,status,component,version,severity,resolution,keywords,cc,stage,has_patch,needs_docs,needs_tests,needs_better_patch,easy,ui_ux 8316,MySQL error with custom primary_key that is not an IntegerField,Julian Bez,Julian Bez,"Create a model with a custom primary key field that is not an IntegerField and another with a foreign key pointing to it: {{{ class Author(models.Model): id = models.PositiveIntegerField(primary_key=True) name = models.CharField(max_length=200) class Article(models.Model): title = models.CharField(max_length=200) author = models.ForeignKey(Author) }}} Let's see how the SQL looks: {{{ BEGIN; CREATE TABLE `dbtest_author` ( `id` integer UNSIGNED NOT NULL PRIMARY KEY, `name` varchar(200) NOT NULL ) ; CREATE TABLE `dbtest_article` ( `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `title` varchar(200) NOT NULL, `author_id` integer NOT NULL ) ; ALTER TABLE `dbtest_article` ADD CONSTRAINT author_id_refs_id_6bbed69f FOREIGN KEY (`author_id`) REFERENCES `dbtest_author` (`id`); CREATE INDEX `dbtest_article_author_id` ON `dbtest_article` (`author_id`); COMMIT; }}} You can see that author_id should reference dbtest_author.id, but they have different data types. Calling syncdb: {{{ Creating table dbtest_author Creating table dbtest_article Traceback (most recent call last): File ""...manage.py"", line 11, in execute_manager(settings) File ""C:\Programme\django_src\django\core\management\__init__.py"", line 334, in execute_manager utility.execute() File ""C:\Programme\django_src\django\core\management\__init__.py"", line 295, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File ""C:\Programme\django_src\django\core\management\base.py"", line 77, in run_from_argv self.execute(*args, **options.__dict__) File ""C:\Programme\django_src\django\core\management\base.py"", line 96, in execute output = self.handle(*args, **options) File ""C:\Programme\django_src\django\core\management\base.py"", line 178, in handle return self.handle_noargs(**options) File ""C:\Programme\django_src\django\core\management\commands\syncdb.py"", line 80, in handle_noargs cursor.execute(statement) File ""C:\Programme\django_src\django\db\backends\util.py"", line 19, in execute return self.cursor.execute(sql, params) File ""C:\Programme\Python25\lib\site-packages\MySQLdb\cursors.py"", line 166, in execute self.errorhandler(self, exc, value) File ""C:\Programme\Python25\lib\site-packages\MySQLdb\connections.py"", line 35, in defaulterrorhandler raise errorclass, errorvalue _mysql_exceptions.OperationalError: (1005, ""Can't create table '.\\db\\#sql-5b4_8.frm' (errno: 150)"") }}} MySQL is unable to add the constraint, because of the different types (integer, integer unsigned) used. The problem goes back to [1970] where a foreign key pointing to an AutoField, a PositiveIntegerField or a PositiveSmallIntegerField always becomes an IntegerField.",,closed,"Database layer (models, ORM)",dev,,fixed,1.0-blocker,sebastian@…,Accepted,1,0,1,1,0,0