与表单集和inlineformset工厂相关的python django预取
inlineformset_factory`50多行。 加载要花很长时间,并且要运行204个查询,才能通过几乎200个重复的查询获取数据 这是我的模型与表单集和inlineformset工厂相关的python django预取,python,django,django-models,django-views,django-forms,Python,Django,Django Models,Django Views,Django Forms,inlineformset_factory`50多行。 加载要花很长时间,并且要运行204个查询,才能通过几乎200个重复的查询获取数据 这是我的模型 class Item_type(models.Model): title = models.CharField(max_length=100, null=True) alias = models.CharField(max_length=20, null=True, blank=True) def __str__(sel
class Item_type(models.Model):
title = models.CharField(max_length=100, null=True)
alias = models.CharField(max_length=20, null=True, blank=True)
def __str__(self):
return str(self.id) + " ("+ str(self.title) + ")"
class Item(models.Model):
name = models.CharField(max_length=150, null=True, unique=True)
active = models.BooleanField(default=False)
code = models.CharField(max_length=20, null=True, blank=True)
item_class = models.ForeignKey(Item_class,null=True, blank=True, on_delete=models.CASCADE, related_name='item_class')
item_type = models.ForeignKey(Item_type,null=True, blank=True, on_delete=models.CASCADE, related_name='item_type')
alias = models.CharField(max_length=20, null=True, blank=True)
barcode = models.CharField(max_length=50, null=True, blank=True)
stuff_qty = models.IntegerField(null=True, blank=True)
def __str__(self):
return str(self.alias) + " " + str(self.name + " (" + str(self.id) + ")")
class ReceipeMaster(models.Model):
TYPE_OPTIONS = (('FINISHED GOODS', 'FINISHED GOODS'),)
receipe_type = models.CharField(max_length=50, choices=TYPE_OPTIONS, default=TYPE_OPTIONS[0])
item = models.ForeignKey(Item, on_delete=models.CASCADE, related_name='receipe')
units = models.IntegerField(default=1)
active = models.BooleanField(default=True)
def __str__(self):
return str(self.item.name)
def get_absolute_url(self):
return reverse("item_management:recipes_show", kwargs={"pk": self.pk})
class ReceipeDetail(models.Model):
master = models.ForeignKey(ReceipeMaster, on_delete=models.CASCADE, related_name='items')
item_type = models.ForeignKey(Item_type, null=True, on_delete=models.PROTECT)
item = models.ForeignKey(Item, on_delete=models.PROTECT)
quantity = models.IntegerField()
def __str__(self):
return str(self.item.name) + " (" + str(self.master) + ")"
如何在表单.inlineformset\u工厂中获取与预取相关的信息
下面是forms.py中的代码
AddReceipeDetailFormSet = forms.inlineformset_factory(
ReceipeMaster,
ReceipeDetail,
fields=( 'item_type', 'item', 'quantity'),
extra=50,
widgets={
'item_type': forms.Select(attrs={'class': 'form-control'}),
'item': forms.Select(attrs={'class': 'form-control'}),
'quantity': forms.NumberInput(attrs={'class': 'form-control'}),
}
)
这是我在views.py中的视图
def create_receipe(request):
child_forms = AddReceipeDetailFormSet(request.POST or None)
parent_form = ReceipeCreateForm(request.POST or None)
context = {'parent_form': parent_form, 'child_forms': child_forms}
if request.method == 'POST':
if parent_form.is_valid():
print('parent form is valid')
else:
print('invalid parent form', parent_form.errors)
if child_forms.is_valid():
print('child form is valid')
else:
print('invalid child form', child_forms.errors)
print("post request is received***", request.POST)
return render(request, 'receipes/create.html', context=context)
关于请添加您的模型
ReceipeMaster
,ReceipeDetail
,以及由字段项目类型
和项目
引用的模型(特别是这些模型的\u str\uuuuuu
方法及其可能引用的任何字段)关于这个问题。@AbdulAzizBarkat为了您的反馈,我添加了模型供您参考,谢谢。这是否回答了您的问题?检查上述链接问题的答案。使用他创建的这些类,您将编写AddReceipeDetailFormSet=forms.inlineformset\u工厂(ReceipeMaster,ReceipeDetail,form=CachingModelChoicesForm,formset=CachingModelChoicesFormSet,…)
,以解决您的问题。(基本上,问题在于表单集中的每个表单都在进行自己的查询以获取选择,链接的答案会缓存这些选择以解决此问题)