0

次の 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'

アプリのmodels.pyファイルに保存して移行を実行すると、すべて問題ありませんでした。ORM を使用して作成されたように、DB を読み取ることができました。ただし、Bill テーブルの行の作成に問題がありました。

Bill モデルの単純な形式です。

class BillForm(ModelForm):

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

問題は、DB シーケンスで生成された ID を取得できないことです。コードでフィールドを生成してから引数として渡す必要があるため、フォームにフィールドを追加するidことはできません。データベースよりも、生のクエリなしでは取得できない別の ID が作成されます。

4

1 に答える 1

0

解決策は本当に簡単です。idBill モデルからフィールドを削除する必要があります。

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 はすべての困難な作業を行い、レガシー データベース シーケンスを正しく使用することができます。Bill オブジェクトは、BillForm を使用して作成できるようになり、適切な ID を持つようになります。

于 2017-01-11T13:01:00.577 に答える