2017-05-03 21 views
1

save()viewで呼び出された後、私のmodelは更新されません。いくつかの場所(herehere)を見ると、私の場合は答えが出ませんでした。私modelはありませんが含まれManyToManyField呼び出し後にDjangoモデルが更新されない.save()

モデル:

class Event(models.Model): 
    name = models.CharField(max_length=120) 
    date = models.DateTimeField(auto_now=False, auto_now_add=False) 
    attendees = models.ManyToManyField(Employee) 
    approval = models.ForeignKey(EventStatus, default=2) 

    def __unicode__(self): 
     return self.name 

    def approve_url(self): 
     return reverse("RGAU:EventApprove", kwargs={"id": self.id}) 

ビュー:

def EventApprove(request, id=None, **kwargs): 

    instance = get_object_or_404(Event, id=id) 

    instance.approval.id = 3 
    instance.save() 

    messages.success(request, "Event Approved") 
    return redirect("RGAU:UserDashboard") 
目標は Eventインスタンスは、ボタンをWebページにプッシュされたときに「承認済み」に更新することです

(したがって、ビューEventApprove)。

instance.approval.id正しい承認ステータスidを割り当てると仮定しますが、保存はコミットされません。

私は間違っていますか?

+0

承認は外部キーです。 'instance.approval.id = 3'を' instance.approval = Approval.objects.get(id = 3) 'に変更することはできますか? – Rafael

答えて

4

これには2通りの方法があります。あなたが関連付ける関連オブジェクトの唯一のPK(ID)の値を持っている場合は、このように、フィールド名_id次の構文を使用します。あなたは便利な関係のインスタンスを持っている場合、あなたはそれを割り当てることができ

instance.approval_id = 3 
instance.save() 

approved = EventStatus.objects.get(id=3) 
instance.approval = approved 
instance.save() 

どちらの方法でも、instance.approvalはid = 3のEventStatusに関連付けられます。

さらに説明すると、instance.approvalは、EventStatusの関連インスタンスを含むinstanceのプロパティです。 instance.approval.idを使用してそれをさらに詳しく調べると、EventStatusインスタンスに触れ、実際にはしたくないそのidを変更します。

instance.approval_idはちょっと魔法ですが、Djangoでは2つのモデルを関連付けるデータベース列の値を直接設定することができます。EventStatusのインスタンスをデータベースから実際にフェッチしてEventに関連付けることができる。これは決して変更されないよく知られている参照ID値を使用しているときのような状況で便利です。しかし、たとえ例えば、それはどこかを定義することをお勧めですので:次に

class EventStatus(models.Model): 
    APPROVED = 3 

    ... etc etc... 

代わりのinstance.approval_id = 3を使用して、あとで理解することが非常に簡単であるinstance.approval_id = EventStatus.APPROVEDを使用することができます。

+0

すばらしい説明、ありがとう。もともと私は '.get()'の代わりに '.filter()'を使って 'Can not assign" [] ":"というエラーを返す適切な 'EventStatus'インスタンスを取得していました。 「承認」は「EventStatus」インスタンスでなければなりません。しかし、これは「オブジェクト」のリストであり、単一の「オブジェクト」ではないので、私は近くで見た方がよいでしょう! – NickBraunagel

+0

Right yea、filterはリストではないクエリーセットを返します。繰り返し実行すると、データベースに出力され、クエリが実行されます。結果は1つ、または複数ではない可能性があります.get()を使用すると、即座にデータベースに送られ、1つの結果行が返されます。それが何も得られない場合、または複数を取得した場合、それは例外をスローします。だから、バグがなければ失敗しない単一のオブジェクトに対するクエリに対して、常にget()を使うのは便利です。 –

関連する問題