在我的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
答案 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