Python Django-从modelformset_工厂的request.POST创建对象时会花费大量时间,有时会使服务器崩溃
我使用的是modelformset\u工厂,在我的视图函数中,我使用的是带有\u post=FormSet(request.post)的form\u 但当表单出现错误时,即当我不更新必填字段时,从request.POST创建forset对象需要花费大量时间,大约需要2-3分钟 不过,它不会抛出任何异常或错误,但在djano服务器的日志中,有时我会观察到以下错误Python Django-从modelformset_工厂的request.POST创建对象时会花费大量时间,有时会使服务器崩溃,python,django,django-forms,Python,Django,Django Forms,我使用的是modelformset\u工厂,在我的视图函数中,我使用的是带有\u post=FormSet(request.post)的form\u 但当表单出现错误时,即当我不更新必填字段时,从request.POST创建forset对象需要花费大量时间,大约需要2-3分钟 不过,它不会抛出任何异常或错误,但在djano服务器的日志中,有时我会观察到以下错误 “线程中处理的异常由开始,您正在遍历可能非常长的对象列表,再次从基中调用它们,然后保存它们(如果我读得正确,则保存两次)——这是大量查询
“线程中处理的异常由开始,您正在遍历可能非常长的对象列表,再次从基中调用它们,然后保存它们(如果我读得正确,则保存两次)——这是大量查询 你能做的是: 1) 将author的值传递给formset,将author作为字段添加到form,在forminit方法中设置它 2) 将已验证的\u添加到\u usr以形成隐藏字段。在forminit方法中将其设置为True 3) 只需保存表单集 作为对注释-。的响应,此处表示如果不将queryset作为参数传递给formset,则它将使用relevantmodel.objects.all()作为默认queryset。()。我想您以前没有注意到。我说过您正在循环浏览很长的列表-我认为这是故意的,您没有将另一个queryset作为值传递给formset。我猜这就是问题的根源
alan我认为这一行的form_与_post=FormSet(request.post)之间存在问题,因为此时执行阻塞。可能是只读属性中出现了问题更改了我的asnwer以响应您的评论。我已添加了这一行form_与_post=FormSet(request.post,queryset=Un_Verified_bn_in.objects.none())现在我遇到了异常[error]Indexer:列表索引超出范围。我对这种行为有点困惑。ohh从表单中得到了它,它与表单集(request.post,queryset=page\u query)一起解决了这个问题!谢谢!做得好。不过-我建议您实现我的想法,进一步限制在该视图中运行的查询。
class Un_Verified_bn_in(models.Model):
id = models.IntegerField(primary_key=True)
phrase = models.CharField(max_length=30)
author = models.CharField(max_length=30,null=True)
time = models.DateField(null=True)
alternate_phrase = models.CharField(max_length=30,null=True)
verified_by_usr = models.BooleanField(max_length=30)
verified_by_admin = models.BooleanField(max_length=30)
discard_word = models.BooleanField(max_length=30)
class Un_Verified_bn_in_form(ModelForm):
def __init__(self, *args, **kwargs):
super(Un_Verified_bn_in_form, self).__init__(*args, **kwargs)
instance = getattr(self, 'instance', None)
if instance and instance.pk:
self.fields['phrase'].widget.attrs['readonly'] = True
self.fields['id'].widget.attrs['readonly'] = True
class Meta:
model = Un_Verified_bn_in
fields = ('id','phrase','alternate_phrase','discard_word')
exclude = ('time','verified_by_usr','verified_by_admin','author')
def user_page(request,lang="bn",locale="bn_in"):
FormSet = modelformset_factory(Un_Verified_bn_in,form=Un_Verified_bn_in_form,extra=0)
query = Un_Verified_bn_in.objects.all().filter(verified_by_usr=False).filter(verified_by_admin=False)
paginator = Paginator(query, 10)
page = request.GET.get('page')
usr_name = request.user
try:
objects = paginator.page(page)
except PageNotAnInteger:
objects = paginator.page(1)
except EmptyPage:
objects = paginator.page(paginator.num_pages)
if request.method == 'POST':
form_with_post = FormSet(request.POST)
if form_with_post.is_valid():
print "form is valid"
instances = form_with_post.save(commit=False)
for instance in instances:
obj = Un_Verified_bn_in.objects.get(pk=instance.id)
obj.author = request.user_name
obj.verified_by_usr = True
instance.save()
obj.save()
context = {'objects':objects,'formset': form_with_post}
return render_to_response('unverified.html', context,
context_instance=RequestContext(request))
else:
page_query = query.filter(id__in=[object.id for object in objects])
formset = FormSet(queryset=page_query)
context = {'objects': objects, 'formset': formset}
return render_to_response('unverified.html', context,
context_instance=RequestContext(request))