Django与遗留数据库 - 如何使用数据库序列?

时间:2017-01-11 13:01:01

标签: django django-models legacy-database database-sequence

给定使用此SQL查询创建的数据库表:

CREATE TABLE Bill
  (
    Time DATE NOT NULL ,
    Address VARCHAR2 (60) NOT NULL ,
    ID           NUMBER NOT NULL
  ) ;

ALTER TABLE Bill ADD CONSTRAINT Bill_PK PRIMARY KEY ( ID ) ;

CREATE SEQUENCE Bill_ID_SEQ START WITH 1 NOCACHE ORDER ;
CREATE OR REPLACE TRIGGER Bill_ID_TRG BEFORE
  INSERT ON Paragony FOR EACH ROW BEGIN :NEW.ID := Bill_ID_SEQ.NEXTVAL;
END;

我必须在Django ORM中使用它,所以我运行了inspectdb命令。它是自动生成的代码:

class Bill(models.Model):
    time = models.DateField()
    address = models.CharField(max_length=60)
    id = models.IntegerField(primary_key=True)

    class Meta:
        managed = False
        db_table = 'bill'

将其保存到app' models.py文件和正在运行的迁移一切都很好。我可以读取DB,就像它是使用ORM创建的。但是在Bill表中创建行时出现问题。

这是Bill模型的简单形式:

class BillForm(ModelForm):

    class Meta:
        model = Bill
        fields = ('time', 'address')

问题是我无法检索用DB序列生成的ID。向表单添加id字段不会起作用,因为我们必须使用代码生成它,然后作为参数传递。即使数据库也会创建不同的ID,如果没有原始查询,将无法检索。

1 个答案:

答案 0 :(得分:0)

解决方案非常简单。我们必须从Bill模型中删除id字段:

class Bill(models.Model):
    time = models.DateField()
    address = models.CharField(max_length=60)
    # Remove 'id' field so the ORM can work properly.
    # id = models.IntegerField(primary_key=True)

    class Meta:
        managed = False
        db_table = 'bill'

这样,Django ORM可以完成所有艰苦工作并正确使用旧数据库序列。现在可以使用BillForm创建Bill对象,它们将具有正确的ID。