通过strip_tags命令查询集(html字符串)

时间:2015-04-17 15:28:42

标签: python html django sorting strip-tags

在我的django应用程序中,我必须按字符串属性对查询集进行排序。这很简单。但是这个字符串属性有HTML标记,我需要将其删除以进行排序。

class Publication(models.Model):
    authors = models.CharField()

我知道queryset.order_by()方法,但据我所知,我不能使用任何方法去除那里的html。

我想出了一个“几乎解决方案”。

>>> from django.utils.html import strip_tags
>>> sorted(Publication.objects.all(), key=strip_tags('authors'))
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/var/www/cms/venv2.7.5/lib/python2.7/site-packages/django/utils/functional.py", line 203, in wrapper
    return func(*args, **kwargs)
  File "/var/www/cms/venv2.7.5/lib/python2.7/site-packages/django/utils/html.py", line 156, in strip_tags
    if not ('<' in value or '>' in value):
TypeError: argument of type 'operator.attrgetter' is not iterable

如何对此查询集进行排序?我的方法是朝着正确的方向发展的吗?它有效吗?那些查询集目前最多可达+ -1500个元素。

提前致谢。

.sogeking

2 个答案:

答案 0 :(得分:2)

这不会像你那样运作。 strip_tag操作需要在数据库级别进行,而不是在Python中进行。

我认为最有效的解决方案是在模型中添加一个字段 - 比如说authors_stripped - 来存储与authors字段相同的内容,但是会从标记中删除。然后,您可以按该字段进行排序。 确保authors_stripped匹配authors的一种简单方法是覆盖您的模型的save方法:

from django.utils.html import strip_tags


class Publication(models.Model):
    authors = models.CharField()
    authors_stripped = models.CharField(editable=False)

    def __save__(self,*args, **kwargs):
        if self.authors:
            self.authors_stripped = strip_tags(self.authors)
        super(Publication, self).save(*args, **kwargs)

authors_stripped的值发生变化时,您可以使用找到的here解决方案仅计算authors值。

@itzmeontv提出的解决方案将会有效,当且仅当您从数据库中检索所有出版物时,这些出版物将被证明是大数据集的效率问题。

答案 1 :(得分:1)

试试这个

sorted(Publication.objects.all(), key=lambda x: x[strip_tags('authors')])

或使用operator.itemgetter

import operator
key=operator.itemgetter('authors')

Publication.objects.all().order_by(strip_tags('authors')) #ascending
Publication.objects.all().order_by('-'+strip_tags('authors')) #descending