2013-08-22 50 views
0

這些都是等被定義模式:Django中篩選出最新記錄

from django.db import models 

class Foo(models.Model): 
    name = models.CharField(max_length=100) 

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

    def latest_bar(self): 
     try: 
      return self.bar_set.latest() 
     except Bar.DoesNotExist: 
      return None 

class Bar(models.Model): 
    name = models.CharField(max_length=100) 
    foo = models.ForeignKey(Foo) 
    created_date = models.DateTimeField(auto_now_add=True) 

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

    class Meta: 
     ordering = ('-created_date',) 
     get_latest_by = 'created_date' 

然後記錄被創建爲:

f1 = Foo.objects.create(name="F1") 
f1.save() 

f2 = Foo.objects.create(name="F2") 
f2.save() 

f3 = Foo.objects.create(name="F3") 
f3.save() 

b1 = Bar.objects.create(name='B1', foo=f1) 
b1.save() 

b2 = Bar.objects.create(name='B2', foo=f1) 
b2.save() 

b3 = Bar.objects.create(name='B3', foo=f1) 
b3.save() 

b4 = Bar.objects.create(name='B4', foo=f2) 
b4.save() 

b5 = Bar.objects.create(name='B5', foo=f2) 
b5.save() 

b6 = Bar.objects.create(name='B6', foo=f3) 
b6.save() 

b7 = Bar.objects.create(name='B7', foo=f3) 
b7.save() 

我想要得到的是最新的「酒吧的所有」富的,這是

[f1.latest_bar(), f2.latest_bar(), f3.latest_bar()] 

=> [<Bar: B3>, <Bar: B5>, <Bar: B7>] 

,因爲可能有大量的Foo,如果我這樣做的:

bars = [] 
for f in Foo.objects.all(): 
    b = f.latest_bar() 
    if b: 
     bars.append(b) 

可能會花費很多時間,是否有可能通過使用queryset過濾器來實現這一點?

+0

我們需要更多的信息。發佈您的'models.py',以便我們知道如何構建查詢。對於1.你會做類似'model.objects.values('name')'。查看關於查詢的django文檔[這裏](https://docs.djangoproject.com/en/dev/ref/models/querysets/)。 – agconti

+0

謝謝,我用更新的示例更新了我的問題,並且需求也改變了。 – vts

回答

0

如果這是一個對象的名單,然後這應該工作:

MyModel.objects.values('name').annotate(max_created_date=Max('created_date')) 
+0

如何獲取對象列表而不是值列表。這意味着我想看到: foo xyz 酒吧 – vts

+0

感謝您的回覆,我更新了我的問題,並提供了更精確的匹配要求。 – vts