调用 .save() 后 Django 模型未更新

Nic*_*gel 4 python django

model以后不会更新save()我叫view。查看几个地方(这里这里)没有为我的案例提供任何答案。我的model确实包含一个ManyToManyField

模型:

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})
Run Code Online (Sandbox Code Playgroud)

看法:

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")
Run Code Online (Sandbox Code Playgroud)

目标是Event在网页上按下按钮时将实例更新为“已批准”(因此视图EventApprove)。

instance.approval.id假设分配正确的批准状态id但未提交保存。

我究竟做错了什么?

lit*_*die 7

你可以用两种不同的方式来做到这一点。如果您只有要关联的相关对象的 pk (id) 值,请使用 fieldname_id语法,如下所示:

instance.approval_id = 3
instance.save()
Run Code Online (Sandbox Code Playgroud)

如果您有一个方便的关系实例,您可以分配它:

approved = EventStatus.objects.get(id=3)
instance.approval = approved
instance.save()
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,您的 instance.approval 现在都将与 id=3 的 EventStatus 相关联。

进一步解释: instance.approval是一个属性,instance其中包含 的关联实例EventStatus。如果您然后通过使用进一步深入研究,instance.approval.id您现在正在触摸 EventStatus 实例并更改它的id,这是您真的不想做的。

instance.approval_idDjango 允许您直接设置关联两个模型的数据库列值是一个小魔法。绕过了从数据库中实际获取 EventStatus 实例的需要,以便能够将其与事件关联。当您使用众所周知的永远不会改变的引用 id 值时,它在这种情况下很方便。但即便如此,在某处定义它们也是一种很好的做法,例如:

class EventStatus(models.Model):
    APPROVED = 3

    ... etc etc...
Run Code Online (Sandbox Code Playgroud)

然后instance.approval_id = 3你可以使用instance.approval_id = EventStatus.APPROVED它来代替使用,这在以后更容易理解。