使用prefetch_related(Model_SET).all()获取相关的Model foreignkey(除了M



使用预取相关,我检索不同仓库库存的列表,如下所示:

型号产品

[没什么特别的]

模型仓库

[没什么特别的]

型号SstStock

class SstStock(models.Model):
warehouse = models.ForeignKey(Warehouse, on_delete=models.CASCADE)
product = models.ManyToManyField(Produit)
qty = models.IntegerField()
last_update = models.DateTimeField(default=timezone.now)

视图.py

class ProductListView(LoginRequiredMixin, ListView):
queryset = Product.objects.prefetch_related('sststock_set').all()
context_object_name = "produits"
paginate_by = 10
template_name = 'products/produits.html'
def get_context_data(self, *args, **kwargs):
context = super(ProductListView, self).get_context_data(
*args, **kwargs)
context['title'] = 'Produits'
return context

模板

{% for produit in produits %}
{{ produit.sku}}<br>
{% for sst in produit.sststock_set.all %}
<span>{{ sst.warehouse.code }} - {{sst.qty}} - {{sst.qty}}</span>
{% endfor %}
{% endfor %}

但当我在模板中获得与仓库相关的信息(例如sst.warehouse.code(时,查询数量会爆炸式增长。(已经有36个查询,页码只有10个产品(

是否有方法将仓库添加到视图中的预取相关中?

您可以使用Prefetch对象[Django doc]:

class ProductListView(LoginRequiredMixin, ListView):
queryset = Product.objects.prefetch_related(
Prefetch('sststock_set', SstStock.objects.select_related('warehouse'))
))
# …

注意:Django的DateTimeField[Django文档]具有auto_now=…参数[Django-doc]使用时间戳。这将自动分配当前日期时间更新对象时,并将其标记为不可编辑(editable=False(,例如默认情况下,它不会出现在CCD_ 6 s中。

好吧,因为我找不到继续使用序列化程序获取sststock_set的方法,所以当时唯一的解决方案是在视图中重建数据json。

data = list()
for product in products:
item = {}
item['sku'] = product.sku
item['pk'] = product.pk
item['famille'] = product.famille.nom
item['etat'] = product.etat.etat
# print(product.nom)
item['mageid'] = product.mageid
item['adresse'] = product.adresse
item['fournisseur'] = product.fournisseur.nom
item['mini'] = product.mini
item['pua'] = float(product.pua)
item['pta'] = float(product.pta)
item['nom'] = product.nom
item['puv'] = float(product.puv)
item['ptv'] = float(product.ptv)
item['cau'] = float(product.cau)
item['cau_cli'] = float(product.cau_cli)
item['maxsst2'] = product.maxsst2
item['sststock'] = list()
for sst in product.sststock_set.all():
item['sststock'].append(
{'sst_code': sst.warehouse.code, 'sst_id': sst.warehouse.pk, 'qty': sst.qty})
data.append(item)
data = json.dumps(data)

return HttpResponse(data, content_type="application/json")

最新更新