我在Django(5.0.4)上有一个模型,有可 Select 的月份和年份,如下所示:

class Item(models.Model):
    MONTHS_CHOICES = [
        ('JANUARY', 'January'),
        ('FEBRUARY', 'February'),
        ('MARCH', 'March'),
        ('APRIL', 'April'),
        ('MAY', 'May'),
        ('JUNE', 'June'),
        ('JULY', 'July'),
        ('AUGUST', 'August'),
        ('SEPTEMBER', 'September'),
        ('OCTOBER', 'October'),
        ('NOVEMBER', 'November'),
        ('DECEMBER', 'December')
    ]
    month = models.CharField(max_length=9, choices=MONTHS_CHOICES, default="JANUARY",  db_index=True)
    year = models.IntegerField(default=0)
    (...)

如果我try 按Item.objects.all().order_by("-year", "month")年和Item.objects.all().order_by("-year", "month")年订购物品. 从逻辑上讲,月份将按字母顺序排序.

我可以做些什么才能按照与MONTHS_CHOICES月份相同的订单订购的商品?

Option B只是重新设计模型,以包括只有年份和月份的DateField,比如this question here,然后按该字段订购

我也try 了this page的解决方案,但对我来说都没有任何效果.

推荐答案

我还没有机会亲自测试一下,但我的猜测是在字典中使用月份的名称作为"Key",其中相应的"Value"是相应月份的有序值

以下是我对这种情况的看法:

class Item(models.Model):
    MONTHS_CHOICES = [
        ('JANUARY', 'January'),
        ('FEBRUARY', 'February'),
        ('MARCH', 'March'),
        ('APRIL', 'April'),
        ('MAY', 'May'),
        ('JUNE', 'June'),
        ('JULY', 'July'),
        ('AUGUST', 'August'),
        ('SEPTEMBER', 'September'),
        ('OCTOBER', 'October'),
        ('NOVEMBER', 'November'),
        ('DECEMBER', 'December')
    ]
    MONTHS_ORDER = {
        'JANUARY': 1,
        'FEBRUARY': 2,
        'MARCH': 3, 
        'APRIL': 4, 
        'MAY': 5,
        'JUNE': 6,
        'JULY': 7, 
        'AUGUST': 8, 
        'SEPTEMBER': 9, 
        'OCTOBER': 10,
        'NOVEMBER': 11,
        'DECEMBER': 12
    }
    month = models.CharField(max_length=9, choices=MONTHS_CHOICES, default="JANUARY",  db_index=True)
    month_numeric = models.IntegerField(editable=False, db_index=True)
    year = models.IntegerField(default=0)

    def (self, *args, **kwargs):
        self.month_numeric = self.MONTHS_ORDER[self.month]
        super().save(*args, **kwargs)

NOTE:如果您的DB中已经有数据,您将需要编辑您的迁移文件,以便为您的DB中已存储的对象自动设置此设置.同样,未经测试,但我想象如下:

def populate_month_numeric(apps, schema_editor):
    Item = apps.get_model('YOUR APP NAME - CHANGE THIS!', 'Item')
    for item in Item.objects.all():
        item.month_numeric = Item.MONTHS_ORDER[item.month]
        item.save() 

然后运行makemigrations后,打开创建的迁移文件,并在Migration类的operations字段中,在末尾附近添加以下内容:

migrations.RunPython(populate_month_numeric)

然后当然实际运行migrate函数,您的查询应该可以如下所示:

items = Item.objects.all().order_by("-year", "month_numeric")

正如我所说,我自己还没有运行这个代码,但"Key"-"Value"映射的这方面是我过go 解决类似问题的方法!

Django相关问答推荐

使用django直接计算geohash而不创建模型

在AWS s3中获取项目的URL

注册新用户时,对象没有属性';is_active';错误:';NoneType';对象没有属性

如何将我的函数添加到值参数?

我如何获得已循环的每个项目的名称?

如何使用来自另一个字段的信息创建字段

如何在 Django 模板视图中显示我的数据?

django 管理员登录突然要求 csrf 令牌

如何在 Django 视图中获取 URL 参数?

Django REST Framework 和 FileField 绝对 url

OrderingFilter 没有属性filter_queryset

get_or_create() 线程安全吗

Django 覆盖模型 Clean() 与 Save()

登录后django重定向不起作用next不发布?

django - 使用 get_or_create 自动创建用户时设置用户权限

为什么我的 Django 单元测试不知道安装了 MessageMiddleware?

暂时禁用 Django 缓存

Python Django 的多线程

如何更改 django 模板中布尔值的打印方式?

Django 1.7 迁移不会重新创建删除的表,为什么?