model
在save()
中调用view
后,我的model
无法更新。查看几个地方(here,here)并没有为我的案例提供任何答案。我的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;
}
,但未提交保存。
我做错了什么?
答案 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.approval
是instance
的属性,其中包含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
,以后会更容易理解。