用Djang中的DB按日期排序

2024-06-26 12:44:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下内容模型.py. 在

from django.db import models

class Address(models.Model):
    addr = models.CharField(max_length=150)

    def __unicode__(self):
        return u'%s' % (self.addr)

class Anniversary(models.Model):
    date = models.DateField()

    def __unicode__(self):
        return u'%s' % (self.date)

class Person(models.Model):
    name = models.CharField(max_length=50)
    birthday = models.DateField()
    anniversary = models.ForeignKey(Anniversary)
    address = models.ForeignKey(Address)

    def __unicode__(self):
        return u'%s %s %s %s' % (self.name, self.birthday, self.anniversary, self.address)

我想把所有条目的内容打印到我的模板中。但按出生日期和当前日期排序。i、 最近的名字。最好的办法是什么。我应该先对它进行排序,然后将其附加到列表或dict中吗?在

任何建议都很好。在

谢谢


Tags: selfdatemodelreturnaddressmodelsdefunicode
3条回答

因为我个人比较喜欢用a型字体来分类。我倾向于使用sorted in render_to_响应进行单值排序,或使用order_by进行多值排序。在return语句中使用sorted可以在某种程度上分割视图/模板之间的差异,因为Django视图并不完全是控制器。不管怎样,这只是我的喜好。也可以在模板中使用dictsort进行单值排序。在

您已经指出要使用多个值进行排序,第一个值按最近的出生日期排序,第二个按名称排序。为此,我将在视图中使用order_by,然后注释我的返回语句:

from django.shortcuts import render_to_response

def view_persons(request):

    persons = Person.objects.all().order_by('-birthday', 'name')

    return render_to_response(
        'view_persons.html',
        {
            'persons': persons,  # ordered by most recent birthday, then name
        },
        context_instance=RequestContext(request)
    )

在模板中,您只需执行以下操作:

^{pr2}$

你可以在模型的元类中添加默认的排序,例如

class Person(models.Model):
    # fields
    class Meta:
        ordering = ('anniversary__date',)

在你的模板中,它很简单:

^{pr2}$

如果需要在视图中自定义排序(根据请求对象筛选出人员):

def myview(request):
    context = dict(
        persons = Person.objects.exclude(person.id=request.user.id)\
                                .order_by('anniversary__date')
    )
    return render_to_response('app/template.html', context)

注意:通过参数order_by('-attr')在你的排序前加一个减号,会颠倒顺序。在

正如@DanielEriksson所提到的,如果你的案子不是假设的,你似乎应该简化事情。在

我想你是在找这个:

          persons = Person.objects.all().order_by(birthday ,anniversary)

在您的视图中,您可以使用以下方法获取当前日期:

^{pr2}$

然后:

          persons = Person.objects.all().order_by(now, anniversary)

希望有帮助!在

相关问题 更多 >