2017-01-11 11 views
0

は、このSQLクエリを使用して作成されたデータベーステーブルを考える:レガシーデータベースを使用したDjango - DBシーケンスの操作方法?

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; 

私はinspectdbのコマンドを実行しているので、DjangoのORMでそれを使用する必要があります。

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テーブルに行を作成する際に問題がありました。

class BillForm(ModelForm): 

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

問題は、私はDBのシーケンスで生成されたIDを取得することができないということです。

これは、ビル・モデルの単純な形式です。フォームにidフィールドを追加すると、コードで生成して引数として渡す必要があるため、機能しません。データベースでさえも、未処理の照会なしでは検索できない異なるIDが作成されます。

答えて

0

解決策は本当に簡単です。私たちは、ビル・モデルからidフィールドを削除する必要があります:DjangoのORMが正しく、すべてのハードワークを作ることができ

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' 

この方法では、従来のデータベース配列を使用しています。 BillオブジェクトはBillFormを使用して作成でき、適切なIDを持ちます。

関連する問題