【发布时间】:2020-04-07 13:34:32
【问题描述】:
作为 Django 新手,我开始有点关心我的 Web 应用程序的性能。
我正在尝试将最初在我的模型中的许多自定义函数/属性转换为自定义管理器中的查询集。
在我的模型中我有:
class Shape(models.Model):
@property
def nb_color(self):
return 1 if self.colors=='' else int(1+sum(self.colors.upper().count(x) for x in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'))
def __str__(self):
return self.name + "-" + self.constraints
@property
def image_url(self):
return format_html(f'{settings.SVG_DIR}/{self}.svg')
@property
def image_src(self):
return format_html('<img src="{url}"|urlencode />'.format(url = self.image_url))
def image_display(self):
return format_html(f'<a href="/static/SVG_shapes/{self}">{self.image_src}"</a>')
但有几点我不清楚:
1/ 在 django 模型中使用适当的装饰器声明是否有任何优点或缺点?
2/ 就数据库调用而言,调用函数/属性的成本是多少
因此,使用自定义管理器/查询集并定义注释以在该级别模拟我的功能是否有附加价值?
3/ 你建议我如何将图像和 nb_color 函数转换为注释
提前致谢
PS:对于图片相关的功能,我主要是想通了:
self.annotate(image_url = Concat(Value(join(settings.SVG_DIR,'')), F('fullname'), Value('.svg'), output_field=CharField()),
image_src = Concat(Value('<img src="'), F('image_url'), Value('"|urlencode />'), output_field=CharField()),
image_display = Concat(Value('<a href="'+ settings.SVG_DIR+'/'), F('fullname'), Value('.svg">'),F('image_src'), Value('</a>'), output_field=CharField()),
)
然而,我在显示 image_src 时遇到了问题 通过:
readonly_fields=['image']
def image(self, obj):
return format_html(obj.image_src)
地址没问题的时候好像没找到图片。
如果有人有想法...
【问题讨论】:
标签: python django django-queryset django-annotate