Python 在Django查询集中对YYYY.MM.DD格式的发布版本进行排序
我有一个Django模型,看起来像这样:Python 在Django查询集中对YYYY.MM.DD格式的发布版本进行排序,python,django,Python,Django,我有一个Django模型,看起来像这样: from django.db import models from distutils.version import LooseVersion # Create your models here. class ReleaseNotes(models.Model): version = models.CharField(max_length=64, db_index=True, help_text="Version/Releas
from django.db import models
from distutils.version import LooseVersion
# Create your models here.
class ReleaseNotes(models.Model):
version = models.CharField(max_length=64, db_index=True, help_text="Version/Release")
status = models.CharField(max_length=64, blank=True, null=True, help_text="Status")
release_date = models.DateField(blank=True, null=True, help_text="Release Date")
description = models.TextField(blank=True, null=True, help_text="Description")
def description_to_bullet_points(self):
return self.description.split('\n')
def release_notes_list(self):
qs = ReleaseNotes.objects.order_by('-version')
return sorted(qs, key=lambda qs:LooseVersion(qs.version))
def __str__(self):
return self.version
class IndexView(generic.ListView):
queryset = ReleaseNotes
template_name = 'release_notes/index.html'
context_object_name = 'release_notes_list'
def get_queryset(self):
qs = ReleaseNotes.objects.all()
return sorted(qs, key=lambda qs:LooseVersion(qs.version), reverse=True)
@classmethod
def release_notes_list(cls):
fields = [
models.expressions.RawSQL("substr(version, 1, instr(version,'.') - 1)", []),
models.expressions.RawSQL("length(substr(version, instr(version,'.') + 1))", []),
models.expressions.RawSQL("substr(version, instr(version,'.') + 1)", []),
]
return cls.objects.extra(order_by=fields)
我用这个模板显示“发行说明”:
{% if release_notes_list %}
<ul>
{% for release_note in release_notes_list %}
<p><b>{{ release_note.version }}</b><br>
{% for bullet_pt in release_note.description_to_bullet_points %}
<br>{{ bullet_pt }}
{% endfor %}
</p>
{% endfor %}
</ul>
{% else %}
<p>No release notes are available.</p>
{% endif %}
我想显示“发行说明”,最新的发行说明在顶部。
但是我有格式为YYYY.MM.DD
的版本,因此版本2020.11.1
不会显示在顶部。版本按以下顺序发布:
2020.8.1
2020.7.1
2020.6.2
2020.6.1
2020.5.4
2020.5.3
2020.5.2
2020.5.1
2020.4.4
2020.4.3
2020.4.2
2020.4.1
2020.2.6
2020.2.5
2020.2.4
2020.2.3
2020.2.2
2020.2.1
2020.11.1
2020.1.4
2020.1.3
2020.1.2
2020.1.1
您可以使用以下命令更改模型中的位置,然后重试
def release_notes_list(self):
qs = ReleaseNotes.objects.order_by('-version')
return sorted(qs, key=lambda qs:LooseVersion(datetime.strptime(qs, '%Y/%M/%D')) )
谢谢大家的回复。我想我已经弄明白了 我从模型中删除了
release\u notes\u list()
from django.db import models
from distutils.version import LooseVersion
# Create your models here.
class ReleaseNotes(models.Model):
version = models.CharField(max_length=64, db_index=True, help_text="Version/Release")
status = models.CharField(max_length=64, blank=True, null=True, help_text="Status")
release_date = models.DateField(blank=True, null=True, help_text="Release Date")
description = models.TextField(blank=True, null=True, help_text="Description")
def description_to_bullet_points(self):
return self.description.split('\n')
def release_notes_list(self):
qs = ReleaseNotes.objects.order_by('-version')
return sorted(qs, key=lambda qs:LooseVersion(qs.version))
def __str__(self):
return self.version
class IndexView(generic.ListView):
queryset = ReleaseNotes
template_name = 'release_notes/index.html'
context_object_name = 'release_notes_list'
def get_queryset(self):
qs = ReleaseNotes.objects.all()
return sorted(qs, key=lambda qs:LooseVersion(qs.version), reverse=True)
@classmethod
def release_notes_list(cls):
fields = [
models.expressions.RawSQL("substr(version, 1, instr(version,'.') - 1)", []),
models.expressions.RawSQL("length(substr(version, instr(version,'.') + 1))", []),
models.expressions.RawSQL("substr(version, instr(version,'.') + 1)", []),
]
return cls.objects.extra(order_by=fields)
目前没有访问Oracle DB的权限,但它应该*如下所示:
from django.db import models
from distutils.version import LooseVersion
# Create your models here.
class ReleaseNotes(models.Model):
version = models.CharField(max_length=64, db_index=True, help_text="Version/Release")
status = models.CharField(max_length=64, blank=True, null=True, help_text="Status")
release_date = models.DateField(blank=True, null=True, help_text="Release Date")
description = models.TextField(blank=True, null=True, help_text="Description")
def description_to_bullet_points(self):
return self.description.split('\n')
def release_notes_list(self):
qs = ReleaseNotes.objects.order_by('-version')
return sorted(qs, key=lambda qs:LooseVersion(qs.version))
def __str__(self):
return self.version
class IndexView(generic.ListView):
queryset = ReleaseNotes
template_name = 'release_notes/index.html'
context_object_name = 'release_notes_list'
def get_queryset(self):
qs = ReleaseNotes.objects.all()
return sorted(qs, key=lambda qs:LooseVersion(qs.version), reverse=True)
@classmethod
def release_notes_list(cls):
fields = [
models.expressions.RawSQL("substr(version, 1, instr(version,'.') - 1)", []),
models.expressions.RawSQL("length(substr(version, instr(version,'.') + 1))", []),
models.expressions.RawSQL("substr(version, instr(version,'.') + 1)", []),
]
return cls.objects.extra(order_by=fields)
原件:
我之所以要求使用数据库类型,是因为高效的解决方案是按数据库类型。我假设你用的是postgres
@classmethod
def release_notes_list(cls):
field = models.expressions.RawSQL("string_to_array(version, '.')::int[]", [])
return cls.objects.extra(order_by=[field])
如果你不使用postgres,请告诉我,我会根据答案进行更新
这是解决方案速度的两倍,并且由于类型错误而崩溃
这里它正在运行:/w tests添加视图code@JavierBuzzi我已经添加了视图。@Javierbuszi我正在使用哦,哇,这真的显示了我使用Django视图是多么少,这已经存在很长时间了。明白了,最后一个问题:你在用什么数据库?作为旁注:模型应该称为“ReleaseNote”,模型从来都不是复数的。这会抛出一个TypeError
我正在使用Oracle.@RedCricket测试。。虽然我的解决方案存在性能问题,但我不能为性能说话。但我怀疑这与我的描述方法有关。这是无法避免的,因为易用胜过易用。@RedCricket你说的有道理