Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django查询集中对YYYY.MM.DD格式的发布版本进行排序_Python_Django - Fatal编程技术网

Python 在Django查询集中对YYYY.MM.DD格式的发布版本进行排序

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

我有一个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/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你说的有道理