2013-02-25 20 views
4

我有以下model.py。使用Django中的數據庫按日期排序

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) 

我想將所有條目的內容打印到我的模板中。但按出生日期與當前日期進行排序。即最近的名字,然後是名字。做這個的最好方式是什麼。我應該先將它排序,然後將其附加到列表或字典中?

任何指針都會很棒。

謝謝,

+0

'order_by'有什麼問題? – wRAR 2013-02-25 21:29:43

+3

如果您的地址和週年紀念模型如此簡單,那麼將這些字段轉移到您的人員模型會更好。 – 2013-02-25 21:29:52

+0

這方面的文檔是相當徹底的... https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.order_by – 2013-03-09 04:43:47

回答

11

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

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) 

鈮在您的order_by參數order_by('-attr')反轉排序之前添加減號。

正如@丹尼爾·埃裏克森所說,如果你的情況不是假設,看來你應該簡化一些東西。

+0

謝謝,奇怪的事情即使我將objects.all()分配給人員。然後遍歷它在模板中沒有顯示任何內容(??) – felix001 2013-02-27 21:54:37

+0

@ felix001添加您的views.py – 2013-03-03 22:44:46

0

我認爲你正在尋找這樣的:

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

在您查看您可以用獲取當前日期:

  import datetime 
      now = datetime.datetime.now() 

然後:

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

希望它可以幫助!

+0

謝謝,但它排序生日的日期,但不是對當前日期(??) – felix001 2013-02-28 20:04:58

+0

謝謝,但也不似乎努力工作。如果我添加(現在,anniversy),然後我得到一個錯誤,說變量沒有被賦值,但如果我只是使用...('現在','生日'),那麼我得到的錯誤------- ---------> 呈現時捕獲到FieldError:無法將關鍵字'now'解析爲字段。選擇是:地址,週年紀念,生日,身份證,姓名 – felix001 2013-03-03 21:48:19

0

我個人喜歡避免在模型中排序,因爲它更像是一個演示/視圖類型的東西。我傾向於在render_to_response中使用排序來進行單值排序,或者使用order_by進行多值排序。在return語句中使用排序讓我可以分離視圖/模板之間的區別,因爲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 %} 
0

我猜的複雜性在於您需要將排序日期與當前日期進行比較,而不是簡單地按日期排序。

如果您使用的是Postgres,並高興地堅持原始的SQL語句,你可能會使用他們的日期時間函數,如年齡

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

否則,你就需要選擇出生在那裏的日期/週年紀念比現在更大。如果重構您的週年紀念模型以將日,月和年存儲爲單獨的字段,可能會更簡單,這樣您就可以忽略過濾的年份。

我最近在問題中發佈了一些代碼,可能會給你一些提示 - 我需要返回最接近現在的事件。參見:

Is it bad practice to return a tuple from a Django Manager method rather than a queryset?