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

时间:2017-05-03 00:14:08

标签: python django

modelsave()中调用view后,我的model无法更新。查看几个地方(herehere)并没有为我的案例提供任何答案。我的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})

型号:

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

目标是将EventApprove实例更新为"已批准"当在网页上按下按钮时(因此视图instance.approval.id)。

id假设分配了正确的批准状态#include <type_traits> #include <iostream> #define ENABLE_IF(...) std::enable_if_t<(__VA_ARGS__), int> = 0 template<class T, class B, ENABLE_IF(std::is_same<void(T::*)(), decltype(&T::x)>::value)> auto has_x_f(T*) -> std::true_type; template<class T, class B> auto has_x_f(B*) -> std::false_type; template<class T, class B> using has_x = decltype(has_x_f<T, B>((T*)nullptr)); template<typename T> struct A { void x() {} static const bool x_hidden; template <typename R, ENABLE_IF(std::is_same<T, R>::value && x_hidden)> void y(R value) { std::cout << "x() is hidden" << std::endl; } template <typename R, ENABLE_IF(std::is_same<T, R>::value && !x_hidden)> void y(R value) { std::cout << "x() is not hidden" << std::endl; } //using t = std::integral_constant<bool, x_hidden>; }; struct B : A<B> { void x() {} }; struct C : A<C> { }; template<typename T> const bool A<T>::x_hidden = has_x<T, A<T>>::value; int main() { B b; C c; std::cout << "B: "; std::cout << b.x_hidden << std::endl; std::cout << "C: "; std::cout << c.x_hidden << std::endl; std::cout << "B: "; b.y(b); std::cout << "C: "; c.y(c); return 0; } ,但未提交保存。

我做错了什么?

1 个答案:

答案 0 :(得分:4)

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

instance.approval_id = 3
instance.save()

如果你有一个关系实例,你可以分配它:

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

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

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

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

class EventStatus(models.Model):
    APPROVED = 3

    ... etc etc...

然后,您可以使用instance.approval_id = 3代替使用instance.approval_id = EventStatus.APPROVED,以后会更容易理解。