自定义Django计数筛选

自定义Django计数筛选,django,django-models,django-views,django-filter,Django,Django Models,Django Views,Django Filter,许多网站将显示: “1.8K页”而不是“1830页” 或 “4320万页”而不是“43200123页” 在Django有没有办法做到这一点 例如,以下代码将生成queryset中对象的量化数量(即3123): 有没有办法添加自定义计数过滤器以返回“3.1K页”而不是“3123页” 提前谢谢!首先,我不会做任何改变Django的ORM部分工作方式的事情。如果你只打算在一个地方使用它,可以在两个地方做这件事——在前端做。话虽如此,有很多方法可以达到这一效果。只要说出一些想法,你可以写一篇合适

许多网站将显示:

  • “1.8K页”而不是“1830页”

  • “4320万页”而不是“43200123页”
在Django有没有办法做到这一点

例如,以下代码将生成queryset中对象的量化数量(即3123):

有没有办法添加自定义计数过滤器以返回“3.1K页”而不是“3123页”


提前谢谢!

首先,我不会做任何改变Django的ORM部分工作方式的事情。如果你只打算在一个地方使用它,可以在两个地方做这件事——在前端做。话虽如此,有很多方法可以达到这一效果。只要说出一些想法,你可以写一篇合适的文章然后,在您的模型上调用count,将其转换为更易于后端阅读的内容。如果您想在前端执行此操作,您可能需要找到一个JavaScript库来执行此转换

稍后我将从我的计算机中编辑此内容,并添加该属性的示例

编辑:为了回答您的评论,更容易实现的方法取决于您的python技能和JavaScript技能。我更喜欢python,所以我可能会在模型的某个地方实现它

Edit2:我已经编写了一个示例,向您展示了如何在基本模型或您需要这些数字的模型上执行
classmethod
。我发现了一个名为的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'
def可读_编号(值,短=假):
#从pypy上的“人性化”软件包修改而来。
幂=[10**x代表x英寸(3,6,9,12,15,18)]
人类力量=(‘千’、‘百万’、‘十亿’、‘万亿’、‘万亿’、‘万亿’)
人的力量(短=('K','M','B','T','QD')
尝试:
value=int(值)
除了(TypeError、ValueError):
返回值
如果值<幂[0]:
返回str(值)
对于序号,枚举中的幂(幂[1:],1):
如果值<功率:
切碎=值/浮点(幂[序数-1])
切碎=格式(切碎,.1f')
如果不短:
返回{}{}.格式(切碎,人幂[ordinal-1])
返回'{}{}'。格式(切碎,人名幂_short[ordinal-1])
类MyModel(models.Model):
@类方法
def可读_计数(cls,short=True):
count=cls.objects.all().count()
返回可读的\u编号(计数,短=短)
打印(可读_编号(62220,True))#返回'62.2K'
打印(可读_编号(6555500))#返回“660万”
我会将该
可读的\u编号
粘贴到某种UTIL中,然后将其导入到模型文件中。一旦有了它,就可以将该字符串粘贴到前端的任何位置


您可以使用
MyModel.readable\u count()
来获取该值。如果您希望它位于
MyModel.objects.readable\u count()下
您需要为您的模型制作一个自定义对象管理器,但这要高级一点。

首先,我不会做任何改变Django的ORM部分工作方式的事情。如果您只打算在一个地方使用它,可以在两个地方做到这一点-在前端进行。尽管如此,有很多方法可以做到这一点o实现这一结果。只需说出一些想法,您可以在模型上编写一个调用count的属性,然后将其转换为更易于后端阅读的内容。如果您想在前端执行此操作,您可能需要找到一个JavaScript库来执行转换

稍后我将从我的计算机中编辑此内容,并添加该属性的示例

编辑:为了回答您的评论,更容易实现的方法取决于您的python技能和JavaScript技能。我更喜欢python,所以我可能会在模型的某个地方实现它

Edit2:我已经编写了一个示例,向您展示了如何在基本模型或您需要这些数字的模型上执行
classmethod
。我发现了一个名为的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'
def可读_编号(值,短=假):
#从pypy上的“人性化”软件包修改而来。
幂=[10**x代表x英寸(3,6,9,12,15,18)]
人类力量=(‘千’、‘百万’、‘十亿’、‘万亿’、‘万亿’、‘万亿’)
人的力量(短=('K','M','B','T','QD')
尝试:
value=int(值)
除了(TypeError、ValueError):
返回值
如果值<幂[0]:
返回str(值)
对于序号,枚举中的幂(幂[1:],1):
如果值<功率:
切碎=值/浮点(幂[序数-1])
切碎=格式(切碎,.1f')
如果不短:
返回{}{}.格式(切碎,人幂[ordinal-1])
返回'{}{}'。格式(切碎,人名幂_short[ordinal-1])
类MyModel(models.Model):
@类方法
def可读_计数(cls,short=True):
count=cls.objects.all().count()
返回可读的\u编号(计数,短=短)
打印(可读_编号(62220,True))#返回'62.2K'
打印(可读_编号(6555500))#返回“660万”
我会将该
可读的\u编号
粘贴到某种UTIL中,然后将其导入到模型文件中。一旦有了它,就可以将该字符串粘贴到前端的任何位置


您可以使用
MyModel.readable\u count()
来获取该值。如果您想在
MyModel.objects.readable\u count()
下获取该值,您需要为您的模型创建一个自定义对象管理器,但这有点高级。

您是想更改实际查询集返回的内容?还是只在页面上显示该内容