[软件设计/软件工程] Django-改进对foreignKey字段组成的查询

[复制链接]
发表于 2022-5-4 15:30:56
问题
我想将可用数据中的报告导出到 CSV 文件中。我写了下面的代码,它工作正常。您如何建议改进查询?

模型:
  1. class shareholder(models.Model):
  2.    title = models.CharField(max_length=100)
  3.    code = models.IntegerField(null=False)

  4. class Company(models.Model):
  5.    isin = models.CharField(max_length=20, null=False)
  6.    cisin = models.CharField(max_length=20)
  7.    name_fa = models.CharField(max_length=100)
  8.    name_en = models.CharField(max_length=100)

  9. class company_shareholder(models.Model):
  10.    company = models.ManyToManyField(Company)
  11.    shareholder = models.ForeignKey(shareholder, on_delete=models.SET_NULL, null=True)
  12.    share = models.IntegerField(null = True) # TODO: *1000000
  13.    percentage = models.DecimalField(max_digits=8, decimal_places=2, null=True)
  14.    difference = models.DecimalField(max_digits=11, decimal_places=2, null=True)
  15.    update_datetime = models.DateTimeField(null=True)
复制代码

看法:
  1. def ExportAllShare(request):
  2.    response = HttpResponse(content_type='text/csv')
  3.    response['Content-Disposition'] = 'attachment; filename="shares.csv"'
  4.    response.write(u'\ufeff'.encode('utf8'))
  5.    writer = csv.writer(response)
  6.    writer.writerow(['date','company','shareholder title','shareholder code','difference','share'])
  7.    results = company_shareholder.objects.all()
  8.    for result in results:
  9.       row = (
  10.         result.update_datetime,
  11.         result.company.first().name_fa,
  12.         result.shareholder.title,
  13.         result.shareholder.code,
  14.         result.difference,
  15.         result.share,
  16.            )
  17.       writer.writerow(row)
  18.    return (response)
复制代码

回答
首先,如果它对你有好处,那么它也很好,不要过早优化。

但是,在这样的查询中,您将遇到 n+1 问题。在 Django 中,您可以使用 select_related 和 prefetch_related 来避免它。像这样:

结果 = company_shareholder.objects.select_related(‘shareholder’).prefetch_related(‘company’).all()

这将减少生成的查询数量。如果您需要更多性能,并且由于您不使用百分比,我会推迟它。

另外,我强烈建议您遵循 PEP8 样式指南并使用大写约定命名您的类,例如 Shareholder 和 CompanyShareholder 。





上一篇:空格分隔列表中的字符串
下一篇:scikit learn和tensorflow有什么区别?可以一起使用吗?

使用道具 举报

Archiver|手机版|小黑屋|吾爱开源 |网站地图

Copyright 2011 - 2012 Lnqq.NET.All Rights Reserved( ICP备案粤ICP备14042591号-1粤ICP14042591号 )

关于本站 - 版权申明 - 侵删联系 - Ln Studio! - 广告联系

本站资源来自互联网,仅供用户测试使用,相关版权归原作者所有

快速回复 返回顶部 返回列表