Django:更改foreignkey约束名称

时间:2013-10-27 11:45:48

标签: django symfony-1.4 doctrine-1.2

我有一个由doctrine / symfony1.4生成的mysql数据库,我需要一个单独的django 1.4项目来引用同一个mysql数据库上的现有表。数据库由许多面向客户的UI共享,无法迁移或复制,symfony和django都需要在同一个数据库上引用/更新相同的表,以便面向UI的客户端同步。不幸的是,学说首先在这些表之间创建了约束名称和索引名称,我无法找到如何强制django使用相同的名称。当我尝试在django对象中包装这些现有表时,这会导致崩溃。

有关如何覆盖或强制django 1.4模型使用特定外键约束名称以及索引的任何想法吗?

更新:添加有关表格设置和崩溃的更多信息

学说架构:

Feature:
    actAs: [Timestampable]
    columns:
      name: { type: string(100) }
      description: { type: string(200) }
      pivotXpos: { type: float, notnull: true }
      pivotYpos: { type: float, notnull: true }
      referenceImageUrl: { type: string(200), notnull: true }
      referenceThumbnailImageUrl: { type: string(200), notnull: true }
      bbox_minx: { type: float, notnull: true }
      bbox_miny: { type: float, notnull: true }
      bbox_maxx: { type: float, notnull: true }
      bbox_maxy: { type: float, notnull: true }
    relations:
      Curve:
        local: id
        foreign: feature_id
        cascade: [delete]
        type: many


Curve:
    actAs: [Timestampable]
    columns:
      name: { type: string(100), notnull:true}
      feature_id: { type: bigint, notnull: true }
    relations:
      Feature: { onDelete: CASCADE, local: feature_id, foreign: id, 
               foreignAlias: Curves }

table sql

CREATE TABLE feature (id BIGINT AUTO_INCREMENT, 
name VARCHAR(100), description VARCHAR(200), 
pivotxpos FLOAT(18, 2) NOT NULL, 
pivotypos FLOAT(18, 2) NOT NULL,
referenceimageurl VARCHAR(200) NOT NULL,
referencethumbnailimageurl VARCHAR(200) NOT NULL, 
bbox_minx FLOAT(18, 2) NOT NULL, 
bbox_miny FLOAT(18, 2) NOT NULL, 
bbox_maxx FLOAT(18, 2) NOT NULL, 
bbox_maxy FLOAT(18, 2) NOT NULL, 
created_at DATETIME NOT NULL, 
updated_at DATETIME NOT NULL, 
PRIMARY KEY(id)) ENGINE = INNODB;

CREATE TABLE curve (id BIGINT AUTO_INCREMENT, 
name VARCHAR(100) NOT NULL, 
feature_id bigint NOT NULL, 
created_at DATETIME NOT NULL, 
updated_at DATETIME NOT NULL, 
INDEX feature_id_idx (feature_id), 
PRIMARY KEY(id)) ENGINE = INNODB;

ALTER TABLE curve ADD CONSTRAINT curve_feature_id_feature_id 
FOREIGN KEY (feature_id) REFERENCES feature(id) ON DELETE CASCADE;

django课程:

class Feature(models.Model):

    class Meta:
        db_table = 'feature'

    name = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    description = models.CharField(max_length=100)
    pivotXpos = models.FloatField()
    pivotYpos = models.FloatField()
    pivotXpos = models.FloatField()
    referenceImageUrl = models.CharField(max_length=200)
    referenceThumbnailImageUrl = models.CharField(max_length=200)
    bbox_minx = models.FloatField()
    bbox_miny = models.FloatField()
    bbox_maxx = models.FloatField()
    bbox_maxy = models.FloatField()

    def __unicode__(self):
        return self.name;


class Curve(models.Model):

    class Meta:
        db_table = 'curve'

    name = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    feature_id = models.ForeignKey(Feature)

    def __unicode__(self):
        return self.name;

崩溃(在django shell内)

>>> Curve.objects.all()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/models/query.py", line 72, in __repr__
    data = list(self[:REPR_OUTPUT_SIZE + 1])
  File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/models/query.py", line 87, in __len__
    self._result_cache.extend(self._iter)
  File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/models/query.py", line 291, in iterator
    for row in compiler.results_iter():
  File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/models/sql/compiler.py", line 763, in results_iter
    for rows in self.execute_sql(MULTI):
  File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/models/sql/compiler.py", line 818, in execute_sql
    cursor.execute(sql, params)
  File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/backends/util.py", line 40, in execute
    return self.cursor.execute(sql, params)
  File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/django/db/backends/mysql/base.py", line 114, in execute
    return self.cursor.execute(query, args)
  File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/MySQLdb/cursors.py", line 174, in execute
    self.errorhandler(self, exc, value)
  File "/Users/a/Documents/web/impression/djangodev/lib/python2.6/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
DatabaseError: (1054, "Unknown column 'curve.feature_id_id' in 'field list'")

2 个答案:

答案 0 :(得分:1)

这是错误: (1054,“字段列表中的未知列''curve.feature_id_id'”) 所以,如果你不想像user257543那样指定db_column, 你可以改为写

feature = models.ForeignKey(Feature)

哪个更干净

答案 1 :(得分:0)

不确定约束/索引名称但我能够通过使用ForeignKeyField上的'db_column'字段选项来解决这个问题

feature_id = models.ForeignKey(Feature,db_column='feature_id')