使用Django中的DB按日期排序

Ric*_*ckD 4 python django

我有以下model.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)
Run Code Online (Sandbox Code Playgroud)

我想将所有条目的内容打印到我的模板中.但按出生日期与当前日期排序.即最近的第一个然后是名字.做这个的最好方式是什么.我应该先将它排序然后将其附加到列表或字典中吗?

任何指针都会很棒.

谢谢,

Hed*_*ide 12

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

class Person(models.Model):
    # fields
    class Meta:
        ordering = ('anniversary__date',)
Run Code Online (Sandbox Code Playgroud)

然后在你的模板中,它就像:

<ul>
    {% for person in persons %}
        <li>{{ person.anniversary.date|date:"M d, Y" }} - {{ person.name }}</li>
    {% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)

如果您需要在视图中进行自定义排序(根据请求对象过滤掉人员):

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)
Run Code Online (Sandbox Code Playgroud)

Nb在order_by参数之前添加减号会order_by('-attr')反转排序.

正如@DanielEriksson所提到的,如果你的情况不是假设,那么你似乎应该简化一些事情.