2009-01-17 12 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') 

Ich möchte alle Themen nach dem neuesten Nachrichtenobjekt zu diesem Thema angefügt bekommen. Ich führte diese Abfrage aus, aber das gibt nicht das eindeutige Abfrage-Set.Queryset-API distinct() funktioniert nicht?

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

Diese Frage scheint unvollständig zu sein. Wo ist die Verwendung von .distinct(), die Ihrer Meinung nach nicht funktioniert? (Es funktioniert übrigens). –

+0

Ja! richtig, ich habe es verpasst! Ich habe jetzt hinzugefügt! – aatifh

Antwort

3

Sie finden die Erklärung in der documentation for .distinct().

Ich würde de-normalisieren, indem Sie ein modified_date Feld zu dem Topic Modell hinzufügen und es aktualisieren, wann immer eine Nachricht gespeichert oder gelöscht wird.

7

Sie brauchen nicht distinct() hier, was Sie brauchen, ist aggregation. Diese Abfrage wird das tun, was Sie wollen:

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

Obwohl, wenn dieser Produktionscode ist, werden Sie wahrscheinlich wollen akaihola Rat und denormalize „last_message_posted“ auf das Thema Modell direkt folgen.

Es ist auch ein Fehler in Ihrem Standardwert für Message.pub_date. Wie Sie es jetzt haben, wann immer Sie den Server zum ersten Mal ausführen und dieser Code geladen wird, wird datetime.now() einmal ausgeführt und dieser Wert wird als pub_date für alle Nachrichten verwendet. Verwenden Sie dies stattdessen, um die aufrufbare Nachricht selbst zu übergeben, so dass sie erst beim Erstellen jeder Nachricht aufgerufen wird:

pub_date = models.DateTimeField(default=datetime.now)