Django - Inspectdb支持这种数据库表吗?

时间:2011-11-04 11:09:47

标签: django inspectdb

我已经测试过“inspectdb”,但我认为我的架构很复杂,因为 示例...表“tdir_files_context”(djangoinspectdb.JPG “附件中的图像”)我得到了这个模型:

class TdirFilesContext(models.Model):
   id_category = models.ForeignKey(TdirCategories, db_column='id_category')
   id_file_context = models.CharField(max_length=20)
   n_file_context = models.CharField(max_length=150)
   coment = models.CharField(max_length=2000)
   id_user_db_ins = models.CharField(max_length=45)
   id_user_db_upd = models.CharField(max_length=45)
   id_user_sys_ins = models.CharField(max_length=45)
   id_user_sys_upd = models.CharField(max_length=45)
   date_ins = models.DateTimeField()
   date_last_upd = models.DateTimeField()
   class Meta:
       db_table = u'tdir_files_context'

此数据库表有两个主键和一个外键。该 Django Model处理这种数据库表吗?

enter image description here

2 个答案:

答案 0 :(得分:3)

首先,没有表可以有两个主键。那是不可能的。我假设您的主键由两列id_categoryid_file_context组成。

不幸的是,Django目前不支持具有复合主键的模型,它只能处理只有一列作为主键的表。

<plug type="shameless">目前正在努力通过Django实现这一目标,请参阅https://code.djangoproject.com/ticket/373以及我在上一次Google Summer of Code中的工作:https://github.com/koniiiik/django </plug>

除此之外,ForeignKey对于Django来说完全没问题,我发现你的桌子没有其他问题。

答案 1 :(得分:2)

koniiiik刚刚给出了一个关于复合主键的非常有趣的答案。

但是当我看到你对模型的定义时,我不确定你真的想要两个主键,而只需要一个外键和一个主键:

class TdirCategories(models.Model):
   id_category = models.AutoField(primary_key=True)

class TdirFilesContext(models.Model):
   id_category = models.ForeignKey(TdirCategories, db_column='id_category')
   id_file_context = models.AutoField(primary_key=True)
   n_file_context = models.CharField(max_length=150)
   coment = models.CharField(max_length=2000)
   id_user_db_ins = models.CharField(max_length=45)
   id_user_db_upd = models.CharField(max_length=45)
   id_user_sys_ins = models.CharField(max_length=45)
   id_user_sys_upd = models.CharField(max_length=45)
   date_ins = models.DateTimeField()
   date_last_upd = models.DateTimeField()
   class Meta:
       db_table = u'tdir_files_context'

命令python manage.py syncdbpython manage.py name_of_your_app_containing_the_model sql

之后执行得很好

你得到了正确的答案:

BEGIN;
CREATE TABLE "app_tdircategories" (
    "id_category" integer NOT NULL PRIMARY KEY
)
;
CREATE TABLE "tdir_files_context" (
    "id_category" integer NOT NULL REFERENCES "app_tdircategories" ("id_category"),
    "id_file_context" integer NOT NULL PRIMARY KEY,
    "n_file_context" varchar(150) NOT NULL,
    "coment" varchar(2000) NOT NULL,
    "id_user_db_ins" varchar(45) NOT NULL,
    "id_user_db_upd" varchar(45) NOT NULL,
    "id_user_sys_ins" varchar(45) NOT NULL,
    "id_user_sys_upd" varchar(45) NOT NULL,
    "date_ins" datetime NOT NULL,
    "date_last_upd" datetime NOT NULL
)
;
COMMIT;

希望它有所帮助:)