我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但未提交保存。
我究竟做错了什么?
你可以用两种不同的方式来做到这一点。如果您只有要关联的相关对象的 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它来代替使用,这在以后更容易理解。
| 归档时间: |
|
| 查看次数: |
4970 次 |
| 最近记录: |