2013-05-16 15 views
7

Daha sonra order_by için kullanabileceğim bir nesneye bir özellik eklemek için açıklama ekleyin. Bununla birlikte, bir ilişki üzerinde bir ilişki alanına açıklama yapmak istiyorum. Biliyorum, bir şekilde çift alt çizgi notasyonunu kullanarak sahaya çıkabilmem gerekiyor, ama kafamın etrafını saracak gibi görünmüyorum.Django: İlgili alanın ilgili bir alanında order_by nasıl yapılır

İşte modeller şunlardır:

class Group(Taggable, Uploadable): 
    name   = models.CharField(max_length=250, db_index=True) 
    description  = models.TextField(max_length=5000, null=True, 
         blank=True, db_index=True) 
    private   = models.BooleanField(default=False) 
    members   = models.ManyToManyField(User, null=True, 
         related_name='members', through='GroupToUser') 
    pending_members = models.ManyToManyField(User, null=True, 
         related_name='pending_members') 
    admin   = models.ForeignKey(User, null=True) 
    timestamp  = models.DateTimeField(auto_now_add=True) 
    author   = models.ForeignKey(User, related_name='author') 

class Discussion(Taggable, Uploadable): 
    author  = models.ForeignKey(User) 
    title  = models.CharField(max_length=250, db_index=True) 
    description = models.TextField(max_length=5000, null=True, 
        blank=True, db_index=True) 
    group  = models.ForeignKey(Group, null=True) 
    timestamp = models.DateTimeField(auto_now_add=True) 

class DiscussionResponse(Uploadable): 
    author  = models.ForeignKey(User) 
    discussion = models.ForeignKey(Discussion) 
    message = models.TextField(max_length=5000) 
    timestamp = models.DateTimeField(auto_now_add=True) 

Yani, Tartışma isteğe bağlı olarak bir Group ile ilişkili olabilir ve DiscussionResponses bir tartışma ile ilişkilidir. Yapmak istediğim, bir gruba bağlı olan herhangi bir tartışmada en son olan DiscussionResponse'ı bulmak ve buna göre sıralamaktır. Ben bu kadarıyla kazanılmış ettik

:

Group.objects.filter(some_filtering).distinct().annotate(
    last_response=Max('some__reverse__relationship__timestamp').order_by(
     '-last_response') 

Sadece bu durumda bir DiscussionResponse üzerinde zaman damgası almak için doğru şekilde anlamaya gibi olamaz.

UPDATE: Gerçekten de açıklanmış bir değerle sipariş verebilirsiniz. İşte ilgili tartışmanın damgası üzerinde order_by ile bir örnek: Bu durumda

>>> groups = Group.objects.all().annotate(
     last_response=Max('discussion__timestamp')).order_by('-last_response') 
>>> for group in groups: 
...  print(group.id, group.last_response) 
...  
... 
(2L, datetime.datetime(2013, 5, 8, 15, 32, 31)) 
(1L, None) 
(3L, None) 
(4L, None) 
(6L, None) 
(7L, None) 
(8L, None) 
(9L, None) 

üst taşındı nedenle, sadece grup 2. tartışmaları ile ilgili olan; Geri kalanlar doğal düzeni korurlar. Yine de yapmak istediklerim, listenin en üstüne taşınan tartışmalar için son yanıtları olan taşıma gruplarıdır. Bu yüzden, 'discussion__discussionresponse__timestamp''un işe yarayacağını düşündüm, ama öyle görünmüyor.

+0

, hiçbiri çalıştı 'Tartışma set__discussionresponse__timestamp' – foresmac

+0

Neyi başarmaya çalıştığınızı anlamıyorum. Örneğin, “last_response = Max (...)” ifadesini, size bir zaman damgası vereceğini ve sonra bu değere göre sipariş verdiğinizi, sütun ile sipariş vermeniz gerektiğini, bir değer değil, doğru mu olduğumu beyan ediyorsunuz? İstediğiniz zaman zaman damgası kolonu tarafından sipariş? –

+0

Açıklamalı bir değerde order_by' yapabilirsiniz; Daha önce hile kullandım. Sorun şu ki, bir Grupla İlgili Tartışmalarla ilgili Tartışma Yanıtlarının zaman damgasını göremiyorum. – foresmac

cevap

1

Tamam, görünüşe göre sadece 'discussion__discussionresponse__timestamp'. Django kabuğunda denedim ve yeni bir DiscussionResponse kaydettikten sonra işe yaramadı, ama tekrar çalıştığında daha sonra birkaç dakika çalıştı:

>>> groups = Group.objects.all().annotate(last_response=Max(
     'discussion__discussionresponse__timestamp')).order_by('-last_response') 
>>> for group in groups: 
...  print(group.id, group.last_response) 
...  
... 
(2L, datetime.datetime(2013, 5, 16, 14, 56, 22)) 
(1L, None) 
(3L, None) 
(4L, None) 
(6L, None) 
(7L, None) 
(8L, None) 
(9L, None) 
>>> 

kimse bunun kaydettikten sonra hemen işe yaramadı neden biliyorsa Veritabanına yeni bir nesne, ancak daha sonra işe yaramadı, bu muhtemelen yararlı bilgiler olurdu. İşte

sadece eklenen doğrulama için başka bir gruba eklenen tartışmalar/yanıtlarıyla sorguya başka run: `discussion__discussionresponse__timestamp`,` discussion_set__discussionresponse__timestamp` ve: Ben aşağıdaki denedim

>>> groups = Group.objects.all().annotate(last_response=Max('discussion__discussionresponse__timestamp')).order_by('-last_response') 
>>> for group in groups: 
...  print(group.id, group.last_response) 
...  
... 
(4L, datetime.datetime(2013, 5, 16, 15, 25, 40)) 
(2L, datetime.datetime(2013, 5, 16, 15, 16, 46)) 
(1L, None) 
(3L, None) 
(6L, None) 
(7L, None) 
(8L, None) 
(9L, None) 
>>> 
+0

Cevaplandı olarak işaretlemekte çekinmeyin. – stellarchariot

İlgili konular