2016-03-03 82 views
5

私はいくつかのレガシーコードから継承したDBスキーマを持っています。今ではDjangoを使ってテーブルをモデルに反映させようと考えています。つまり、私はテーブルをdjangoモデルを使って生成することはできません。私はそうのように、このに行を挿入するとDjangoモデルで自動生成された主キーIDを取得する方法

class StudentProfile(models.Model): 
    id=models.IntegerField(primary_key=True) 
    joining_on=models.DateField() 
    brothername=models.CharField(max_length=45) 

    class Meta: 
     db_table="student_profile" 

- ::テーブルスキーマはそうのようになります -

mysql> desc student_profile; 
+-------------+-------------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+-------------+-------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| joining_on | datetime | YES |  | NULL |    | 
| brothername | varchar(45) | YES |  | NULL |    | 
+-------------+-------------+------+-----+---------+----------------+ 
3 rows in set (0.01 sec) 

今、私はこのスキーマ用に作成したDjangoのモデルは次のようになります -

StudentProfile.objects.insert(brothername="Bro") 

行が正しく挿入されています。しかし、idフィールドを抽出する方法はありません。このフィールドはAutoFieldではないため、djangoはMySqlによって自動的に生成されたIDをコピーしません。行が作成されたidの値を取得するにはどうすればよいですか?私は(https://code.djangoproject.com/ticket/8799#comment:1)を確認しましたが、これは設計上のようです。しかし、まだidにアクセスしてStudentProfileモデルに反映させる方法が必要です。私に何ができる?

デフォルトのsave()をオーバーライドして、モデルのsave()に明示的にidを指定する方法があります。しかし、それは正しい方法ですか?データベース(MySql)はIDを生成する方法を提供します。アプリケーションで実行中のカウンタを維持するのではなく、この事実を私の利点として使用できる必要があります。何かヒント?あなたはすなわち、完全id列を定義するスキップでき

+1

? – Selcuk

+0

もし私がそれをしないと、Djangoは自動的にproject.app.StudentProfile.idのようなタイプのフィールドを作成します。明らかに、私の基になるスキーマには、この名前の列はありません。要するに、私はDjangoの 'AutoField'が提供するすべてのものを望んでいます。名前を私のものにしたいだけです。 – abhayAndPoorvisDad

+2

Djangoはデフォルトで 'id'という列を作成します。これはあなたのレガシーな列と同じです。 'project.app.StudentProfile.id'はPythonコードのフィールド名です。データベースの列名ではありません。この方法ではうまくいかないのですか? – Selcuk

答えて

6

class StudentProfile(models.Model): 
    # id=models.IntegerField(primary_key=True) 
    joining_on=models.DateField() 
    brothername=models.CharField(max_length=45) 

    class Meta: 
     db_table="student_profile" 

Djangoは、従来の列と同じであるデフォルトでidという名前のオートインクリメント・カラムを作成したり、使用します。

列名が異なっていた場合は、次のような、別の名前でAutoFieldを使用することができます。あなたがすべてであなたのモデルに `id`フィールドを定義しない場合はどうなり

my_id = models.AutoField(primary_key=True) 
関連する問題