2010-09-28 8 views
0

modèles connexes:objets de commande par la plupart des vues uniques (stockées dans une autre table avec ip) dans django

models.py

class Entry(models.Model): 
    ... 

class EntryView(models.Model): 
    entry = models.ForeignKey(Entry) 
    dt_clicked = models.DateTimeField(auto_now_add=True) 
    ip = models.CharField(max_length=15, db_index=True, blank=True) 
    host = models.CharField(max_length=64, db_index=True, blank=True) 
    referer = models.CharField(max_length=64, db_index=True, blank=True) 

    def __unicode__(self): 
     return "%s -> %s" % (self.ip, self.entry.headline) 

Je suppose que je pouvais faire quelque chose comme ceci:

vues .py

... 
popular = Entry.articles.values('ip').annotate(Count("entry_views__id")).order_by() 
... 

Mais je ne vois pas comment cela fonctionnerait puisqu'il n'y a pas de champ pour EntryView in Entry.

Répondre

1

Vous pouvez effectuer les opérations suivantes:

popular = Entry.objects.annotate(count = 
    Count("entryview__ip")).order_by('-count') 

J'ai testé cela en utilisant les deux modèles que vous avez données ci-dessus. Cela renverra une liste de Entry instances annotées avec le nombre EntryView.ip pour chaque instance, classées par ordre décroissant de nombre (les plus populaires en premier).

+0

Merci, cela fonctionne :) – demux

+0

uhm, non, ce n'est pas groupé par ip. – demux

+0

popular = Entry.objects.annotate (count = Count ("entryview__ip", distinct = True)). Order_by ('- count') – demux