小编dur*_*enk的帖子

Django formset,查询每个表单的关系字段

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个查询.

  • 1为PurOrder实例,
  • 1表示PurOrderItem实例
  • 20为PurOrderItem的选定材料.

想想看,如果有1000个PurOrderItem

使用提供的select_related,它将材料添加到PurOrderItemselect,但是当它显示它时,我想,它再次查询.

我使用django-autocomplete-light,因此它使我无法查询所有材质实例,但它会不断查询所选材质,即使我选择了相关材质也能显示它.

理想情况下,我会选择具有预取purorderitem和相关材料的PurOrder实例,这意味着3个查询.当轮到他们时,将使用预取的purorderitem和材料.

请建议我避免选择查询的方法.

注意:我尽量避免在这里缓存.

UPDATE

我创建这个问题很久以后,我尝试了解决方案.问题是,formset的形式彼此不了解.因此,提供的查询集的selected_related或prefetch_related查找不会传递给formset表单.

python django django-models django-forms django-queryset

15
推荐指数
1
解决办法
580
查看次数

定制django foreignfield

任何人都知道如何创建一个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 django-models

6
推荐指数
2
解决办法
170
查看次数

使用as_manager覆盖默认查询集

Django文档指出,我们可以使用管理器的get_queryset方法覆盖默认查询集。

如果我使用model.Queryset和as.manager方法避免重复方法该怎么办。如何覆盖默认查询?

似乎模型的get_queryset方法。在这种情况下Queryset似乎不起作用。

谢谢。

django

6
推荐指数
1
解决办法
765
查看次数

Django在视图中向formset添加表单

我陷入了设计问题.

想象一下订单模型和材料模型,

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做爷爷计算.这是我想要避免的.

django formset

4
推荐指数
1
解决办法
930
查看次数

带有django自动补全灯的django-filter

有没有人成功地同时使用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)

django django-filter django-autocomplete-light

1
推荐指数
1
解决办法
1243
查看次数