Models.py
class Material(BaseModelClass):
material = models.CharField(max_length=25, verbose_name='Material')
def __str__(self):
return self.material
class PurOrder(BaseModelClass):
order_number = models.CharField(max_length=25)
class PurOrderItem(BaseModelClass):
order = models.ForeignKey(PurOrder, on_delete=models.CASCADE)
material = models.ForeignKey(Material, on_delete=models.PROTECT)
Run Code Online (Sandbox Code Playgroud)
我创建了一个PurOrder表单和PurOrderItem表单集
PurOrderForm = modelform_factory(PurOrder, fields=('order_number',))
PurOrderFormset = inlineformset_factory(PurOrder, PurOrderItem,fields=('material',))
Run Code Online (Sandbox Code Playgroud)
初始化如下.
form = PurOrderForm(instance=order_instance)
queryset = order_instance.purorderitem_set.all().select_related('material',)
formset = PurOrderFormset(instance=order_instance, queryset=queryset)
Run Code Online (Sandbox Code Playgroud)
如果选择的purorder有20个PurOrderItem,则此设置会花费22个查询.
想想看,如果有1000个PurOrderItem
使用提供的select_related,它将材料添加到PurOrderItemselect,但是当它显示它时,我想,它再次查询.
我使用django-autocomplete-light,因此它使我无法查询所有材质实例,但它会不断查询所选材质,即使我选择了相关材质也能显示它.
理想情况下,我会选择具有预取purorderitem和相关材料的PurOrder实例,这意味着3个查询.当轮到他们时,将使用预取的purorderitem和材料.
请建议我避免选择查询的方法.
注意:我尽量避免在这里缓存.
UPDATE
我创建这个问题很久以后,我尝试了解决方案.问题是,formset的形式彼此不了解.因此,提供的查询集的selected_related或prefetch_related查找不会传递给formset表单.
任何人都知道如何创建一个foreignkey字段,并使它始终指向相同的模型,到目前为止,我得到了这些.
class PanMachineTimeUnitField(models.ForeignKey):
def __init__(self, **kwargs):
to = 'panbas.PanBasTimeUnit'
kwargs['verbose_name'] = _('Machine Unit')
kwargs['related_name'] = 'machine_unit'
super(PanMachineTimeUnitField, self).__init__(to, **kwargs)
Run Code Online (Sandbox Code Playgroud)
但是我在开始时遇到了错误.我的目标是使用它,
machine_unit = PanMachineTimeUnitField()
Run Code Online (Sandbox Code Playgroud)
无需进一步声明.
编辑:我想要这个,因为,我会在几个地方安静地使用这个外键.如果我想更改字段的verbose_name,我希望我的所有字段都受此更改的影响.详细名称就是一个例子,它可能是另一个属性.
我不想使用设置py来声明默认值.
Django文档指出,我们可以使用管理器的get_queryset方法覆盖默认查询集。
如果我使用model.Queryset和as.manager方法避免重复方法该怎么办。如何覆盖默认查询?
似乎模型的get_queryset方法。在这种情况下Queryset似乎不起作用。
谢谢。
我陷入了设计问题.
想象一下订单模型和材料模型,
class Material(models.Model):
material_code = models.CharField(max_length=40)
standard_price = models.DecimalField()
class Order(models.Model):
customer = models.ForeignKey(Customer)
class OrderItems(models.Model):
order = models.ForeignKey(Order)
material = models.ForeignKey(Material)
price = models.DecimalField()
Run Code Online (Sandbox Code Playgroud)
在我的订单详细信息视图中,我使用inlineformset_factory(Order,OrderItems)填充orderitems
我想要的行为如下:
如果用户想要添加更多订单项,我想将用户重定向到材料列表页面,用户选择一个或多个材料并确认,然后我将其重定向到新添加的项目再次订购详细信息视图.
我正在考虑这些工作,例如django管理员操作与中间页面.
在添加新的订购项目之前,我还想从物料standard_price设置订单项价格,这意味着我想在将其添加到订单项之前修改formsets值.
我想在这里问的问题是,是否有一种更简单的方法来实现这一点,似乎将formset数据存储到session并用新项重新填充formset并不容易.我会考虑另一个解决这个问题的方法.
我不想要js解决方案,想象一下我的订单模型上的字段,grandtotal,我可以计算总项目数量,用js解决方案我可能要用js做计算逻辑,用户添加项目并更改价格然后我用js做爷爷计算.这是我想要避免的.
有没有人成功地同时使用dal和django-filter?下面的尝试是我的,我尝试使用filterset_factory,提供模型类和字段列表,然后尝试使用futuremodelform。我有 ,
ModelForm没有指定模型类。
我认为这只是发生的许多错误之一。之前做过的任何人,我都必须使用filterset_factory,并根据参数创建动态类,我也想覆盖小部件,以便可以使用dal小部件。
#testing filterset
from dal import autocomplete
from django.db import models
class PanFilterSet(django_filters.FilterSet):
filter_overrides = {
models.ForeignKey: {
'filter_class': autocomplete.ModelSelect2,
},
}
def pan_filterset_factory(model,fields):
meta = type(str('Meta'), (object,), {'model': model,'fields':fields,'form':autocomplete.FutureModelForm})
filterset = type(str('%sFilterSet' % model._meta.object_name),
(PanFilterSet,), {'Meta': meta})
return filterset
searchFormFilterSet = pan_filterset_factory(self.model_class,self.final_search_fields)
f = searchFormFilterSet(self.request.GET, queryset=self.get_queryset())
print f.form.as_p()
Run Code Online (Sandbox Code Playgroud)