4

我有以下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)

我想将所有条目的内容打印到我的模板中。但按出生日期与当前日期排序。即最近的第一个,然后是名称。做这个的最好方式是什么。我应该先对其进行排序,然后将其附加到 list 或 dict 吗?

任何指针都会很棒。

谢谢,

4

4 回答 4

12

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

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

然后在您的模板中它很简单:

<ul>
    {% for person in persons %}
        <li>{{ person.anniversary.date|date:"M d, Y" }} - {{ person.name }}</li>
    {% endfor %}
</ul>

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

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)

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

正如@DanielEriksson 提到的,如果您的情况不是假设的,那么您似乎应该简化事情。

于 2013-02-25T21:30:05.863 回答
0

我想你正在寻找这个:

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

在您看来,您可以使用以下方法获取当前日期:

          import datetime 
          now = datetime.datetime.now()

接着 :

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

希望能帮助到你!

于 2013-02-26T00:44:27.870 回答
0

我想复杂性在于您需要将排序日期与当前日期进行比较,而不是简单地按日期排序。

如果您使用 Postgres 并且乐于坚持使用原始 SQL,则可能会使用它们的 datetime 函数,例如 age

http://www.postgresql.org/docs/8.1/static/functions-datetime.html

否则,您需要选择出生日期/周年纪念日大于现在的位置。如果您重构周年纪念模型以将日、月和年存储在单独的字段中,则可能会更简单,这样您可以在过滤时忽略年份。

我最近在一个问题中发布了一些代码,这可能会给你一些提示——我需要返回最接近现在的事件。看:

从 Django Manager 方法而不是查询集返回元组是不好的做法吗?

于 2013-03-10T22:09:40.700 回答
0

我个人喜欢避免在模型中排序,因为它更像是一个演示/视图类型的东西。我倾向于在 render_to_response 中使用 sorted 进行单值排序,或者使用 order_by 进行多值排序。在 return 语句中使用 sorted 可以让我拆分视图/模板之间的差异,因为 Django 视图并不完全是控制器。无论如何,这只是我的偏好。您还可以在模板中使用dictsort进行单值排序。

您已表明要使用多个值进行排序,首先按最近的出生日期,其次按姓名。为此,我将在视图中使用 order_by,然后注释我的 return 语句:

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)
    )

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

{% if persons %}
  <table>
    <thead>
      <tr>
        <th>Birthday</th>
        <th>Name</th>
      </tr>
    </thead>
    <tbody>
  {% for person in persons %}
      <tr>
        <td>{{ person.birthday }}</td>
        <td>{{ person.name }}</td>
      </tr>
  {% endfor %}
    </tbody>
  </table>
{% else %}
  <p>There are no people!</p>
{% endif %}
于 2013-03-10T01:34:18.810 回答