首先,我不会做任何改变 Django 的 ORM 部分工作方式的事情。如果您只打算在一个地方使用它,可以在两个地方完成 - 在前端进行。话虽如此,有很多方法可以实现这一结果。只是为了表达一些想法,您可以在模型上编写一个调用 count 的属性,然后将其转换为后端更易于阅读的东西。如果您想在前端执行此操作,您可能需要找到一个可以进行转换的 JavaScript 库。
稍后我将在我的计算机上对其进行编辑并添加该属性的示例。
编辑:回答您的评论,更容易实现取决于您在 python 和 JavaScript 方面的技能。我更喜欢 python,所以我可能会在模型的某个地方做它。
Edit2:我写了一个示例,向您展示如何在基本模型或您需要这些数字的模型上执行classmethod。我找到了一个名为humanize 的python 包,我利用它的函数将这些转换为可读的,并对其进行了一些修改以允许数千并取出一些超大数转换。
def readable_number(value, short=False):
# Modified from the package `humanize` on pypy.
powers = [10 ** x for x in (3, 6, 9, 12, 15, 18)]
human_powers = ('thousand', 'million', 'billion', 'trillion', 'quadrillion')
human_powers_short = ('K', 'M', 'B', 'T', 'QD')
try:
value = int(value)
except (TypeError, ValueError):
return value
if value < powers[0]:
return str(value)
for ordinal, power in enumerate(powers[1:], 1):
if value < power:
chopped = value / float(powers[ordinal - 1])
chopped = format(chopped, '.1f')
if not short:
return '{} {}'.format(chopped, human_powers[ordinal - 1])
return '{}{}'.format(chopped, human_powers_short[ordinal - 1])
class MyModel(models.Model):
@classmethod
def readable_count(cls, short=True):
count = cls.objects.all().count()
return readable_number(count, short=short)
print(readable_number(62220, True)) # Returns '62.2K'
print(readable_number(6555500)) # Returns '6.6 million'
我会将readable_number 粘贴在某种实用程序中,然后将其导入您的模型文件中。一旦你有了它,你就可以把那个字符串粘在你想要的前端的任何地方。
您将使用MyModel.readable_count() 来获取该值。如果你想在MyModel.objects.readable_count() 下使用它,你需要为你的模型创建一个自定义对象管理器,但这有点高级。