给定使用此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,如果没有原始查询,将无法检索。
答案 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。