【问题标题】:Many-to-many relationship in Django "ProgrammingError: column shoe_size_run.id does not exist"Django中的多对多关系“ProgrammingError:列 shoe_size_run.id 不存在”
【发布时间】:2016-05-12 10:27:45
【问题描述】:

我使用inspectdb 工具通过自省现有数据库来创建模型。

部分 ERD:

模型.py:

class Shoe(models.Model):
    sku = models.AutoField(primary_key=True)
    style_number = models.CharField(unique=True, max_length=6)
    factory_style_number = models.CharField(unique=True, max_length=10, blank=True, null=True)
    stock_name = models.CharField(max_length=10)
    season = models.CharField(max_length=30)
    date_created = models.DateField()
    category_code = models.ForeignKey(Category, models.DO_NOTHING, db_column='category_code')
    brand_code = models.ForeignKey(Brand, models.DO_NOTHING, db_column='brand_code')
    factory_number = models.ForeignKey(Factory, models.DO_NOTHING, db_column='factory_number')
    spec_sheet = models.ForeignKey('SpecSheet', models.DO_NOTHING, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'shoe'

class ShoeSizeRun(models.Model):
    sku = models.ForeignKey(Shoe, models.DO_NOTHING, db_column='sku')
    size_run = models.ForeignKey('SizeRun', models.DO_NOTHING)

    class Meta:
        managed = False
        db_table = 'shoe_size_run'
        unique_together = (('sku', 'size_run'),)

class SizeRun(models.Model):
    size_run_id = models.AutoField(primary_key=True)
    run = models.IntegerField()
    width = models.CharField(max_length=4)
    pairs_of_five = models.IntegerField(blank=True, null=True)
    pairs_of_five_and_half = models.IntegerField(blank=True, null=True)
    pairs_of_six = models.IntegerField(blank=True, null=True)
    pairs_of_six_and_half = models.IntegerField(blank=True, null=True)
    pairs_of_seven = models.IntegerField(blank=True, null=True)
    pairs_of_seven_and_half = models.IntegerField(blank=True, null=True)
    pairs_of_eight = models.IntegerField(blank=True, null=True)
    pairs_of_eight_and_half = models.IntegerField(blank=True, null=True)
    pairs_of_nine = models.IntegerField(blank=True, null=True)
    pairs_of_nine_and_half = models.IntegerField(blank=True, null=True)
    pairs_of_ten = models.IntegerField(blank=True, null=True)
    pairs_of_ten_and_half = models.IntegerField(blank=True, null=True)
    pairs_of_eleven = models.IntegerField(blank=True, null=True)
    pairs_of_eleven_and_half = models.IntegerField(blank=True, null=True)
    pairs_of_twelve = models.IntegerField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'size_run'`

虽然,这些是这些表的 sql 定义:

CREATE TABLE shoe (
  sku                  SERIAL NOT NULL, 
  style_number    varchar(6) NOT NULL UNIQUE, 
  factory_style_number varchar(10) UNIQUE, 
  stock_name      varchar(10) NOT NULL, 
  season               varchar(30) NOT NULL, 
  date_created         date NOT NULL, 
  category_code        int4 NOT NULL, 
  brand_code           int4 NOT NULL, 
  factory_number       int4 NOT NULL, 
  spec_sheet_id        int4, 
  PRIMARY KEY (sku));
CREATE TABLE shoe_size_run (
  sku         int4 NOT NULL, 
  size_run_id int4 NOT NULL, 
  PRIMARY KEY (sku, 
  size_run_id));
CREATE TABLE size_run (
  size_run_id              SERIAL NOT NULL, 
  run                      int4 NOT NULL, 
  width                    varchar(4) NOT NULL, 
  pairs_of_five            int4, 
  pairs_of_five_and_half   int4, 
  pairs_of_six             int4, 
  pairs_of_six_and_half    int4, 
  pairs_of_seven           int4, 
  pairs_of_seven_and_half  int4, 
  pairs_of_eight           int4, 
  pairs_of_eight_and_half  int4, 
  pairs_of_nine            int4, 
  pairs_of_nine_and_half   int4, 
  pairs_of_ten             int4, 
  pairs_of_ten_and_half    int4, 
  pairs_of_eleven          int4, 
  pairs_of_eleven_and_half int4, 
  pairs_of_twelve          int4, 
  PRIMARY KEY (size_run_id));
ALTER TABLE shoe_size_run ADD CONSTRAINT FKshoe_size_544815 FOREIGN KEY (sku) REFERENCES shoe (sku);
ALTER TABLE shoe_size_run ADD CONSTRAINT FKshoe_size_544404 FOREIGN KEY (size_run_id) REFERENCES size_run (size_run_id);

现在,我在 Django 中使用多对多表时遇到问题。为什么会出现这个错误?

我该如何解决这个问题?

【问题讨论】:

  • 请复制堆栈跟踪的文本内容(“切换到复制和粘贴视图”)并用它替换屏幕截图。还要贴出错误发生时正在调用的视图代码。
  • @solarissmoke 我刚刚添加了它,谢谢。

标签: django database postgresql


【解决方案1】:

您的表 shoe_size_run 有一个复合主键 (sku, size_run_id)。不幸的是,Django 还不支持这个(见ticket 373

如果您想在 Django 中使用该表,则必须向该表添加一个单列主键。最简单的列名是id,因为这是 Django 所期望的默认值。

查看您的图表,您还需要对 shoe_image 表执行相同的操作。

【讨论】:

  • 所以,我应该添加一个名为id 的代理键,将skusize_run_id 作为外键(但不是主键)。对吗?
  • 我应该编辑现有数据库,是唯一可能的解决方案吗?
  • 我不知道任何其他解决方案。
【解决方案2】:

表为shoe_size_run,列为size_run_id。所以你的模型字段需要是size_run_id 而不是size_run

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-12
    • 2016-04-11
    • 2016-10-01
    • 2018-05-23
    • 2017-12-16
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多