2009-01-17 16 views
5
class Message(models.Model): 
    subject = models.CharField(max_length=100) 
    pub_date = models.DateTimeField(default=datetime.now()) 

class Topic(models.Model): 
    title = models.CharField(max_length=100) 
    message = models.ManyToManyField(Message, verbose_name='Discussion') 

Tüm konuları, konuya eklenen son iletinin nesnesine göre sıralamak istiyorum. Bu sorguyu gerçekleştirdim ancak bu, farklı bir sorgulama yapmıyor.Queryset API'si ayrı() çalışmıyor mu?

>> Topic.objects.order_by('-message__pub_date').distinct() 
+0

Bu soru eksik görünüyor. Çalıştığını düşündüğünüz .distinct() kullanımı nerede? (Bu arada, işe yarıyor). –

+0

Evet! Doğru, özledim! Şimdi ekledim! – aatifh

cevap

3

Sen documentation for .distinct() yılında açıklamayı bulacaksınız.

Topic modeline bir modified_date alanı ekleyerek ve bir İleti kaydedildiğinde veya silindiğinde onu güncelleyerek normalleştirmekteyim.

7

Burada farklı() gerek yok, ihtiyacınız olan şey aggregation. Bu sorgu istediğini yapar:

from django.db.models import Max 
Topic.objects.annotate(Max('message__pub_date')).order_by('-message__pub_date__max') 

bu üretim kodu ise, muhtemelen akaihola tavsiyelerine ve doğrudan Konu modeli üzerine "last_message_posted" denormalize isteyeceksiniz rağmen

.

Ayrıca, Message.pub_date için varsayılan değerinizde bir hata var. Şimdi sahip olduğunuz gibi, sunucuyu ilk çalıştırdığınızda ve bu kod yüklendiğinde, datetime.now() bir kez çalıştırılacak ve bu değer tüm Mesajlar için pub_date olarak kullanılacaktır. Bunun yerine, her Mesaj oluşturuluncaya kadar çağrılabilir olmayan kelimeyi geçmek için kullanın: