问题
我想将可用数据中的报告导出到 CSV 文件中。我写了下面的代码,它工作正常。您如何建议改进查询?
模型:
- class shareholder(models.Model):
- title = models.CharField(max_length=100)
- code = models.IntegerField(null=False)
- class Company(models.Model):
- isin = models.CharField(max_length=20, null=False)
- cisin = models.CharField(max_length=20)
- name_fa = models.CharField(max_length=100)
- name_en = models.CharField(max_length=100)
- class company_shareholder(models.Model):
- company = models.ManyToManyField(Company)
- shareholder = models.ForeignKey(shareholder, on_delete=models.SET_NULL, null=True)
- share = models.IntegerField(null = True) # TODO: *1000000
- percentage = models.DecimalField(max_digits=8, decimal_places=2, null=True)
- difference = models.DecimalField(max_digits=11, decimal_places=2, null=True)
- update_datetime = models.DateTimeField(null=True)
复制代码
看法:
- def ExportAllShare(request):
- response = HttpResponse(content_type='text/csv')
- response['Content-Disposition'] = 'attachment; filename="shares.csv"'
- response.write(u'\ufeff'.encode('utf8'))
- writer = csv.writer(response)
- writer.writerow(['date','company','shareholder title','shareholder code','difference','share'])
- results = company_shareholder.objects.all()
- for result in results:
- row = (
- result.update_datetime,
- result.company.first().name_fa,
- result.shareholder.title,
- result.shareholder.code,
- result.difference,
- result.share,
- )
- writer.writerow(row)
- return (response)
复制代码
回答
首先,如果它对你有好处,那么它也很好,不要过早优化。
但是,在这样的查询中,您将遇到 n+1 问题。在 Django 中,您可以使用 select_related 和 prefetch_related 来避免它。像这样:
结果 = company_shareholder.objects.select_related(‘shareholder’).prefetch_related(‘company’).all()
这将减少生成的查询数量。如果您需要更多性能,并且由于您不使用百分比,我会推迟它。
另外,我强烈建议您遵循 PEP8 样式指南并使用大写约定命名您的类,例如 Shareholder 和 CompanyShareholder 。
|