例えば。
class One(models.Model):
text=models.CharField(max_length=100)
class Two(models.Model):
test = models.Integer()
many = models.ManyToManyField(One, blank=True)
管理パネルでオブジェクトを保存しようとすると、次のようなエラーが発生します。
「多対多の関係を使用するには、'Two' インスタンスに主キーの値が必要です。」
私はジャンゴ1.3を使用しています。Two クラスに AutoField を追加しようとしましたが、うまくいきません。
これは私のコードです。
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,
}))
PS私は自分の失敗を見つけました。モデル中です。save メソッドで多対多を使用しました。使用前にチェックを入れていますが、どうにもなりません。
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()
これは私を助けてくれますが、それがジャンゴのやり方だとは思いません。興味深いのは、この管理パネルの表示エラーをチェックせずに、オブジェクトを作成することです。ここで、Two からアイテムを選択して保存すると、オブジェクトに full_cost がありませんが、オブジェクトを表示すると、管理パネルが選択を記憶し、選択した Two アイテムを表示します...理由がわかりません。
これを保存するにはどうすればよいですか?