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)

すべてのエントリの内容をテンプレートに出力したいと考えています。ただし、現在の日付に対して生年月日でソートされます。つまり、最新の名前、次に名前です。これを行う最善の方法は何ですか。最初に並べ替えてから、リストまたは 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 にこだわる場合は、age などの日時関数を使用できる可能性があります。

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

それ以外の場合は、生年月日/記念日が現在より後の日付を選択する必要があります。日、月、年を別々のフィールドに格納するように記念日モデルをリファクタリングして、フィルタリング時に年を無視できるようにすると、より簡単になる場合があります。

最近、いくつかのコードを質問に投稿しました。これにより、ヒントが得られる可能性があります。現在に最も近いイベントを返す必要があります。見る:

クエリセットではなく Django Manager メソッドからタプルを返すのは悪い習慣ですか?

于 2013-03-10T22:09:40.700 に答える
0

個人的には、モデルでの並べ替えを避けたいと思っています。これは、プレゼンテーション/ビュー タイプのものだからです。単一値の並べ替えには render_to_response で、複数値の並べ替えには order_by で sorted を使用する傾向があります。Django ビューは完全にコントローラーではないため、return ステートメントで sorted を使用すると、ビューとテンプレートの違いを分割できます。とにかく、これは私の好みです。テンプレートでdictsortを使用して、単一値の並べ替えを行うこともできます。

複数の値を使用して並べ替えたいことを示しました。最初は最新の生年月日で、2 番目は名前で並べ替えます。これを行うには、ビューで 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 に答える