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.
, hiçbiri çalıştı 'Tartışma set__discussionresponse__timestamp' – foresmac
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ş? –
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