这应该是一个简单的问题,但现在它已经让我失望了一段时间。
我想保存一个模型,但我不断收到上述错误。
class Favorite(models.Model):
post=models.ForeignKey(Post)
user=models.ForeignKey(User)
note=models.TextField(max_length=1000, blank=True)
def listing(request, pid):
post=get_object_or_404(Post,pk=pid)
favform=FavoriteForm()
try:
ratings=post.post_rating_set.all()
score=ratings.aggregate(mark=Avg('rating'))
score=int(score.get('mark',0))-1
except AttributeError:
ratings=''
score=1000
if request.method=="POST" and request.POST.get('save_it',''):
user=User.objects.get(pk=request.user.id)
favorite=FavoriteForm(request.POST)
if favorite.is_valid:
favorite.save(commit=False)
favorite.user=user
favorite.post=post
favorite.save()
我的表单验证,我已经测试了用户和帖子,它们都包含预期的查询集。我尝试不先保存最喜欢的表单,但也失败了。 m2m不适合这里。
这是mysql设置错误吗?
答案 0 :(得分:6)
您错误地使用了commit=False
。 save()
返回一个实例,而您只是在表单上调用两次保存。
请改为:
favorite = favorite.save(commit=False)
# now, favorite is an instance returned by save.
favorite.user=user
favorite.post=post
favorite.save()
我个人将表单最喜欢的形式命名为区分实例和表单。
答案 1 :(得分:1)
您可以在方法声明之前放置装饰器。
@transaction.commit_on_success
def listing(request, pid):
post=get_object_or_404(Post,pk=pid)
...
并删除此行:
favorite.save(commit=False)