例如。
class One(models.Model):
text=models.CharField(max_length=100)
class Two(models.Model):
test = models.Integer()
many = models.ManyToManyField(One, blank=True)
当我尝试在管理面板中保存我的对象时,我会收到错误,例如:
“'两个'实例需要在使用多对多关系之前拥有主键值。”
我使用django 1.3。我尝试将AutoField添加到Two类,但它也不起作用。
这是我的代码。
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response, redirect
from django.template import RequestContext
from django.core.urlresolvers import reverse
from project.foo.forms import FooForm
from project.foo.models import Foo
from project.fooTwo.views import fooTwoView
def foo(request, template_name="foo_form.html"):
if request.method == 'POST':
form = FooForm(data=request.POST)
if form.is_valid():
foo = Foo()
foo.name = request.POST.get("name")
foo.count_people = request.POST.get("count_people")
foo.date_time = request.POST.get("date_time")
foo.save()
return fooTwoView(request)
else:
form = FooForm()
return render_to_response(template_name, RequestContext(request, {
"form": form,
}))
P.S。我发现自己失败了。它在模型中。我在保存方法中使用了多对多。我在使用前添加了检查,但没有帮助。
class Foo(models.Model):
name = models.CharField(max_length=100, null=False, blank=False)
count_people = models.PositiveSmallIntegerField()
menu = models.ManyToManyField(Product, blank=True, null=True)
count_people = models.Integer()
full_cost = models.IntegerField(blank=True)
def save(self, *args, **kwargs):
if(hasattr(self,'menu')):
self.full_cost = self.calculate_full_cost()
super(Foo, self).save(*args, **kwargs)
def calculate_full_cost(self):
cost_from_products = sum([product.price for product in self.menu.all()])
percent = cost_from_products * 0.1
return cost_from_products + percent
我尝试使用
等保存方法进行黑客攻击if(hasattr(self,Two)):
self.full_cost = self.calculate_full_cost()
这对我很有帮助,但我不认为这是django方式。有趣的是,没有这个检查管理面板显示错误,但创建对象。现在,如果我从两个选择项目并保存,我的对象没有full_cost,但当我查看我的对象时,管理面板记住了我的选择,并向我显示我的两个项目,我选择的...我不知道为什么。
我如何保存?
答案 0 :(得分:0)
为什么不使用“OneToOneField”而不是“多对多”
答案 1 :(得分:0)
您的代码存在很多问题。最明显的是
1 /在您的视图中,使用表单进行用户输入验证/清理/转换,然后忽略已经过santized /转换的数据并直接从请求中获取未经过处理的输入。使用form.cleaned_data而不是request.POST来获取数据,甚至更好地使用ModelForm,它将负责为您创建一个完全填充的Foo实例。
2 / Python方法中没有隐含的“this”(或“self”或其他)指针,你必须明确地使用“self”来获取实例属性。这是你的模型的“保存”方法真正做的: def save(self, *args, **kwargs):
# test the truth value of the builtin "id" function
if(id):
# create a local variable "full_cost"
full_cost = self.calculate_full_cost()
# call on super with a wrong base class
super(Banquet, self).save(*args, **kwargs)
# and exit, discarding the value of "full_cost"
现在关于你的问题:Foo.save显然不是基于m2m相关对象计算某些内容的正确位置。编写运行计算的不同方法并更新Foo并保存并在保存m2m后调用它(提示:ModelForm将负责为您保存m2m相关对象),或者只使用m2m_changed信号。
话虽如此,我强烈建议您花几个小时学习Python和Django - 它会为您节省大量时间。