Django OneToField引用默认' id'而不是实际的主键

时间:2014-09-04 11:05:29

标签: django

我有一个非托管模型客户端

class Client(models.Model):
   client_id = models.IntegerField('ID', primary_key=True)
   name      = models.CharField()

   class meta:
      manage = False

我使用Client扩展User

class Account(models.Model):
   user   = models.OneToOneField(User)
   client = models.OneToOneField(Client, to_field='client_id')

我认为,由于Client.client_id模型的定义,即使没有明确的Client.id,Django也会创建to_field='client_id'而不是Client的外键引用。但sqlmigrate显示:

BEGIN;

CREATE TABLE `pubsite_account` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `deg_client_id` integer NOT NULL UNIQUE, `user_id` integer NOT NULL UNIQUE);
ALTER TABLE `pubsite_account` ADD CONSTRAINT pubsite_account_deg_client_id_73086fddd308cd6f_fk_Clients_id FOREIGN KEY (`deg_client_id`) REFERENCES `Clients` (`id`);
ALTER TABLE `pubsite_account` ADD CONSTRAINT pubsite_account_user_id_33ed558985f73b32_fk_auth_user_id FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`);

COMMIT;

设置to_field='client_id'时没有任何变化。任何想法都将不胜感激。

  • Django版本:1.8,1.7(是的,我试过两个)
  • 数据库:mysql

2 个答案:

答案 0 :(得分:0)

我现在无法尝试,但我认为db_column正是您所寻找的

client = models.OneToOneField(Client, db_column='client_id')

答案 1 :(得分:0)

在#django-dev中讨论后,结果证明是bug

在打开故障单时,开发人员 MarkusH 提供临时解决方法:

  1. 将模型上的managed = False更改为=True
  2. 获得新的迁移文件后,将模型上的托管选项更改回False 并在相应的迁移文件中将'managed': False添加到CreateModel操作中的options数组。
  3. -------编辑---------

    从故障单页面,此错误已得到修复。所以,如果你来这里做同样的事情,只需更新Django。