2

我正在将 Django 与 MySQL 一起使用,并且在使用“inspectdb”命令创建我的 models.py 文件后遇到问题。

下载:

CREATE TABLE YDB_Collects (
  COriginal_Data_Type_ID VARCHAR(16) NOT NULL,
  CTask_Name VARCHAR(16) NOT NULL,
  PRIMARY KEY (COriginal_Data_Type_ID, CTask_Name),
  INDEX FK_COLLECTS_TASK (CTask_Name),
  CONSTRAINT FK_COLLECTS_ORIGINAL_DATA_TYPE FOREIGN KEY (COriginal_Data_Type_ID) REFERENCES YDB_Original_Data_Type (Original_Data_Type_ID),
  CONSTRAINT FK_COLLECTS_TASK FOREIGN KEY (CTask_Name) REFERENCES YDB_Task (Task_Name)
)

如您所见,COriginal_Data_Type_IDandCTask_Name是外键,也是复合主键。

对于这个 DDL,Django 的“inspectdb”命令给出了这个模型:

class YdbCollects(models.Model):
    coriginal_data_type = models.ForeignKey('YdbOriginalDataType', db_column='COriginal_Data_Type_ID')  # Field name made lowercase.
    ctask_name = models.ForeignKey('YdbTask', db_column='CTask_Name')  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'ydb_collects'
        unique_together = (('COriginal_Data_Type_ID', 'CTask_Name'),)

但是当我运行“makemigrations”命令时,它给了我错误信息:

“unique_together”指的是不存在的字段“COriginal_Data_Type_ID”和“CTask_Name”

当我改变时:

unique_together = (('COriginal_Data_Type_ID', 'CTask_Name'),)

进入:

unique_together = (('coriginal_data_type', 'ctask_name'),)

然后是的,一切正常。但这是正确的方法吗?似乎代码与我的 DDL 具有不同的架构。我定义的原始外键是数据类型的 ID,而不是数据类型本身。

我在这里做错了吗?我的COriginal_Data_Type_IDCTask_Name领域在哪里?

4

1 回答 1

0

这已在 Django 1.10 及更高版本中修复(并向后移植到 Django 1.8.8 和 1.9)。

这是一个 Django 错误,修复在这里:django/django@2cb50f9

它涉及 django/core/management/commands/inspectdb.py 中的此更改:

# tup = '(' + ', '.join("'%s'" % c for c in columns) + ')'                        # Change this
  tup = '(' + ', '.join("'%s'" % column_to_field_name[c] for c in columns) + ')'  # to this
  unique_together.append(tup)
于 2015-11-25T14:58:21.507 回答