2016-04-17 4 views
0

Ich habe eine Reddit-ähnliche Django-App, in der Benutzer interessante URLs (Links) posten und dann öffentlich unter ihnen kommentieren können. Die beiden Datenmodelle dies zu vertreten sind:Objekte aus Django-Queryset basierend auf der Aktualität ausschließen

class Link(models.Model): 
    description = models.TextField(validators=[MaxLengthValidator(500)]) 
    submitter = models.ForeignKey(User) 
    submitted_on = models.DateTimeField(auto_now_add=True) 

class Publicreply(models.Model): 
    submitted_by = models.ForeignKey(User) 
    answer_to = models.ForeignKey(Link) 
    submitted_on = models.DateTimeField(auto_now_add=True) 
    description = models.TextField(validators=[MaxLengthValidator(250)]) 

Wie abfragen ich für alle Links, die mindestens 1 oder mehr publicreply haben und zweitens, wo die neuesten publicreply ist nicht von self.request.user? Ich habe das Gefühl, etwas wie folgt aus:

Link.objects.filter(publicreply__isnull=False).exclude(**something here**) 

Bitte geben! Leistung ist auch der Schlüssel, also je einfacher, desto besser!

Antwort

1

Für Leistung und Einfachheit können Sie sowohl die Anzahl der Antworten und die neueste Antwort Cache:

class Link(models.Model): 
    ... 
    number_of_replies = models.PositiveIntegerField(default=0) 
    latest_reply = models.ForeignKey('myapp.Publicreply', related_name='+', blank=True, null=True, on_delete=models.SET_NULL) 

Wenn eine Antwort eingegeben wird, aktualisieren Sie die entsprechenden link.number_of_replies und link.latest_reply.

würde die Abfrage dann:

Link.objects.filter(number_of_replies__gte=1)\ 
      .exclude(latest_reply__user=request.user)