Djangoで作成したばかりのレコードのIDを取得するにはどうすればよいですか?


82

プロジェクトの1つにDjango1.3を使用していますが、データベースに保存したばかりのレコードのIDを取得する必要があります。

データベースにレコードを保存するために、以下のコードのようなものがあります。

n = MyData.objects.create(record_title=title, record_content=content)
n.save()

レコードのIDは、自動インクリメントを保存しました。そのIDを取得して、コード内の別の場所で使用する方法はありますか?


13
新しいインスタンスが自動的に保存されるためn.save()、この行は不要ですMyData.objects.create
ダニエルローズマン

私の答えのstackoverflow.com/a/25807622/3762142は... htmlページにあなたのIDを取得します
ラジャ・サイモン

回答:


119

n.id保存後に使用します。

主キーの自動インクリメント」を参照してください。


2
ビューのフォームを使用してデータを保存する場合、fromsオブジェクトによって保存されたIDにアクセスするにはどうすればよいですか?
Neeraj Kumar 2016

2
それはする必要がありますn.pk、それはあなたが主キーを自分で追加するか、または1を追加し、それのidという名前のなかった場合にのみ、IDとなりますので、。
Joel GMathew19年

@JamesOこのIDをモデルインスタンスとして取得または解決する方法。
JeetPatel20年

54

になりますn.pk

Model.pk」を引用するには:

主キーフィールドを自分で定義するか、Djangoに提供させるかに関係なく、各モデルにはpkというプロパティがあります。これはモデルの通常の属性のように動作しますが、実際には、モデルの主キーフィールドである属性のエイリアスです。他の属性の場合と同じように、この値を読み取って設定でき、モデルの正しいフィールドが更新されます。


4
素敵な発見。これは、呼び出し.pkがデフォルトIDまたはカスタムIDのいずれかを参照するため、おそらく「ベストプラクティス」と見なされることを示しています。
j_syk 2011

上記のリンクは、djangoの開発中バージョンに移動します。v 1.7-v1.10も同じことを言っています:docs.djangoproject.com/en/1.10/ref/models/instances/…v1.7 以前についてはよくわかりません
キース


1

save()を削除し、pkを直接取得します。

n = MyData.objects.create(record_title=title, record_content=content)
n.pk

1

IDへのアクセスに関しても同様の問題がありました。Django 3.0.5では、これがIDへのアクセス方法です。例と変数名を使用して、以下を参照してください。

instance = n.save()
# return the id
instance[0].id 

上記の変数「インスタンス」はリストです。上記のメソッドでidにアクセスすると、Django 3でAttributeError( "オブジェクトに属性 'id'"がありません)が返されます。

この回答は、を使用する場合に適用されますmodelformset_factory。これは、Djangoのドキュメントで説明されているようにDjangoモデルからFormクラスを作成する場合に当てはまります。


0

誰かがこの質問を読んでいる場合、残りの回答は、オブジェクトの作成後もIDへのアクセスに問題があります。idモデルで整数として定義しないように注意してください。Djangoでは無料なので、IDを書き込んだり使用したりすることはできませんAutofield

#No
class TestModel(models.Model):
    id = models.IntegerField(primary_key=True)
    something...


#Ok
class TestModel(models.Model):
    id = models.AutoField(primary_key=True)
    something...

#Ok
class TestModel(models.Model):
    something...

id整数として定義するTestModel.objects.create(か、withを指定save()すると、Noneが返されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.