按日期时间的月/日排序 Django QuerySet?

发布于 2024-10-04 06:40:24 字数 285 浏览 5 评论 0原文

我有一个人员列表,每个人都有一个出生日期,可以预见地存储在 DateField 中。我正在尝试创建一个这些人的列表 - 按他们出生的排序(不考虑年份) - 以获得某种“谁的生日是即将出现”显示。

我似乎无法通过此人的 datetime.month 值来订购 QuerySet。有没有什么方法可以做到这一点,而不必强制使用 list()

预先感谢,如果问题需要澄清,请告诉我。

I have a list of people, each person having a birthdate, which is predictably stored in a DateField. I'm trying to create a list of those people—sorted by the month and day of their birth (disregarding the year)—to have a sort of "who's birthday is coming up" display.

I can't seem to order a QuerySet by the person's datetime.month value. Is there any way that this could be done without having to resort to coercing to a list()?

Thanks in advance and please let me know if the question needs clarification.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

谁把谁当真 2024-10-11 06:40:24

对于 django >= 2.1

您可以通过在 DateField 上使用月份和日期查找名称对 QuerySet 进行排序。

SomeModel.objects.order_by('birth_date__month', 'birth_date__day')

对于 django >= 1.10

使用数据库函数 提取以通过 生成额外的月份和日期列annotate 方法,然后 order_by 这些列,您可以仅按生日对 QuerySet 进行排序。

from django.db.models.functions import Extract

SomeModel.objects.annotate(
    birth_date__month = Extract('birth_date', 'month'),
    birth_date__day = Extract('birth_date', 'day')
).order_by('birth_date__month', 'birth_date__day')

对于较旧的 django 版本

对于旧版 django 版本,您可以使用 QuerySet.extra(),但您必须编写数据库特定查询

  • MySQL

    SomeModel.objects.extra(select={
            'birth_date_month': 'MONTH(birth_date)',
            'birth_date_day': 'DAY(出生日期)'
        },
        order_by=['出生日期_月份','出生日期_日']
    )
    
  • PostgreSQL

    SomeModel.objects.extra(select={
            'birth_date_month': 'EXTRACT(出生日期中的月份)',
            'birth_date_day': 'EXTRACT(出生日期中的天数)'
        },
        order_by=['出生日期_月份','出生日期_日']
    )
    
  • SQlite

    SomeModel.objects.extra(select={
            'birth_date_month': 'strftime("%m",birth_date)',
            '出生日期': 'strftime("%d", 出生日期)'
        },
        order_by=['出生日期_月份','出生日期_日']
    )
    

For django >= 2.1

You can sort the QuerySet by using month and day lookup names on DateField.

SomeModel.objects.order_by('birth_date__month', 'birth_date__day')

For django >= 1.10

Use database-function Extract to generate extra month and day columns by annotate method, then order_by these columns you can sort the QuerySet by their birthday only.

from django.db.models.functions import Extract

SomeModel.objects.annotate(
    birth_date__month = Extract('birth_date', 'month'),
    birth_date__day = Extract('birth_date', 'day')
).order_by('birth_date__month', 'birth_date__day')

For older django versions

For older django versions you can do the same using QuerySet.extra(), but you have to write database specific query.

  • MySQL

    SomeModel.objects.extra(select={
            'birth_date_month': 'MONTH(birth_date)',
            'birth_date_day': 'DAY(birth_date)'
        },
        order_by=['birth_date_month','birth_date_day']
    )
    
  • PostgreSQL

    SomeModel.objects.extra(select={
            'birth_date_month': 'EXTRACT(MONTH FROM birth_date)',
            'birth_date_day': 'EXTRACT(DAY FROM birth_date)'
        },
        order_by=['birth_date_month','birth_date_day']
    )
    
  • SQlite

    SomeModel.objects.extra(select={
            'birth_date_month': 'strftime("%m", birth_date)',
            'birth_date_day': 'strftime("%d", birth_date)'
        },
        order_by=['birth_date_month','birth_date_day']
    )
    
凉世弥音 2024-10-11 06:40:24

您可以使用 QuerySet.extra() 定义月份字段并按其排序:

SomeModel.objects.extra(select={'birthmonth': 'MONTH(birthdate)'},
    order_by=['birthmonth']) 

You can use QuerySet.extra() to define a month field and sort by it:

SomeModel.objects.extra(select={'birthmonth': 'MONTH(birthdate)'},
    order_by=['birthmonth']) 
莳間冲淡了誓言ζ 2024-10-11 06:40:24

较新版本的 django 可以查找 DateFields 和 DateTimeFields。
https://docs.djangoproject.com/en/1.11 /ref/models/database-functions/#extract

MyModel.objects.order_by('birthday__month', 'birthday__day')

Newer versions of django have the lookup on DateFields and DateTimeFields.
https://docs.djangoproject.com/en/1.11/ref/models/database-functions/#extract

MyModel.objects.order_by('birthday__month', 'birthday__day')

醉生梦死 2024-10-11 06:40:24

我使用 django 1.10.8 进行测试

from django.db.models.functions import Extract
from your_project.your_app.models import Person


CHOICE_MONTH = (
    (None, '--'),
    (1, 1),
    (2, 2),
    (3, 3),
    (4, 4),
    (5, 5),
    (6, 6),
    (7, 7),
    (8, 8),
    (9, 9),
    (10, 10),
    (11, 11),
    (12, 12),
)

class PersonSearchForm(forms.Form):

    name = forms.CharField(label=u'name', required=False)
    month = forms.ChoiceField(label='month', choices=CHOICE_MONTH, required=False)

    def __init__(self, *args, **kwargs):
        self.corporation = kwargs.pop('corporation', None)
        super(PersonSearchForm, self).__init__(*args, **kwargs)

    def get_result_queryset(self):
        q = Q(corporation=self.corporation)
        if self.is_valid():
            name = self.cleaned_data['name']
            if name:
                q = q & Q(name__icontains=name)
            month = self.cleaned_data['month']
            if month:
                q = q & Q(month=int(month))

        return Person.objects.annotate(month=Extract('birthday', 'month'),
                                       day=Extract('birthday', 'day')).filter(q).order_by('month', 'day')

I tested using django 1.10.8

from django.db.models.functions import Extract
from your_project.your_app.models import Person


CHOICE_MONTH = (
    (None, '--'),
    (1, 1),
    (2, 2),
    (3, 3),
    (4, 4),
    (5, 5),
    (6, 6),
    (7, 7),
    (8, 8),
    (9, 9),
    (10, 10),
    (11, 11),
    (12, 12),
)

class PersonSearchForm(forms.Form):

    name = forms.CharField(label=u'name', required=False)
    month = forms.ChoiceField(label='month', choices=CHOICE_MONTH, required=False)

    def __init__(self, *args, **kwargs):
        self.corporation = kwargs.pop('corporation', None)
        super(PersonSearchForm, self).__init__(*args, **kwargs)

    def get_result_queryset(self):
        q = Q(corporation=self.corporation)
        if self.is_valid():
            name = self.cleaned_data['name']
            if name:
                q = q & Q(name__icontains=name)
            month = self.cleaned_data['month']
            if month:
                q = q & Q(month=int(month))

        return Person.objects.annotate(month=Extract('birthday', 'month'),
                                       day=Extract('birthday', 'day')).filter(q).order_by('month', 'day')
无风消散 2024-10-11 06:40:24

Post.objects.all().order_by('date_posted__ 分钟').reverse()
其中 date_posted 是您在 Post 模型中使用的属性。

Post 只是一个示例模型

Post.objects.all().order_by('date_posted__minute').reverse()
where date_posted is your attribute you used in your Post model.

Post is just an example model

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文