2010-05-17 13 views
6

(Jestem nowy dla Pythona i Django, więc proszę o sekundę mnie przepraszać Przepraszam, jeśli otrzymałem odpowiedź gdzie indziej i nie mogłem go znaleźć)Korzystając z aplikacji do głosowania Django i Django, w jaki sposób mogę zamówić zestaw zapytań według głosów każdego z przedmiotów?

Załóżmy, że mam model Link i przez Django Użytkownicy aplikacji głosujących mogą głosować na instancjach linków. Jak mogę zamówić te instancje linków zgodnie z ich wynikiem, np. wyświetlaj najpierw te z wyższym wynikiem.

Zakładam, że mógłbym użyć menedżera get_top do głosowania w django, ale to dałoby mi tylko najlepsze instancje linków scoringowych i nie uwzględniałoby innych parametrów, które chciałbym dodać (na przykład te linki, które należą do określonego użytkownika lub stronicowania lub cokolwiek innego).

Domyślam się, że napisałem niestandardowego menedżera dla mojego modelu linku, w którym mogę filtrować zestaw zapytań według wyniku każdego elementu. Jeśli dobrze rozumiem, że będę musiał przechodzić przez każdy element, sprawdź jego wynik, a następnie umieść listę (lub słownik), która zostanie następnie posortowana zgodnie z wynikiem każdego elementu. To nie zwróci zestawu zapytań, ale słownik z każdym elementem.

Czy tu czegoś brakuje?

edit:

Oto okrojoną wersję modelu łączu:

class Link(models.Model): 
    user = models.ForeignKey('auth.User') 
    category = models.ForeignKey(Category) 
    date = models.DateTimeField(auto_now_add=True, null=True, blank=True) 
    is_deleted = models.BooleanField(default=False, blank=True) 
    links = ValidLinkManager() 
    objects = models.Manager() 

i kiedy głosów użytkowników Mam to moim zdaniem:

Vote.objects.record_vote(link, user, vote) 

gdzie link jest instancja Link, użytkownik jest instancją auth.User, a głosowanie to 1, 0 lub -1. ValidLinkManager odfiltrowuje tylko te linki, dla których parametr is_deleted ma wartość True.

+0

Czy możesz umieścić kod, być może jak wygląda Twój model Link ...? – kafuchau

+0

w porządku tutaj jest .. –

+0

Nie jestem do końca pewien, co próbujesz tutaj zrobić. Czy chcesz tylko zamówić wyświetlanie głosów? – Brant

Odpowiedz

1

Metoda get_top w VoteManager nie jest skomplikowana. Spójrz na jego kod (w manage.py:122). Możesz łatwo utworzyć jego wersję, która akceptuje filtr jako inny parametr i stosuje go do zestawu zapytań "obiekty" po jego utworzeniu, w linii 158 - w ten sposób możesz dodać inne filtry, takie jak te, których brakuje.

Może również, że jako plaster z powrotem do Jonatana, a on go umieścić w Django głosowania :)

0

wybrałem użyć rodzajowego relacji w moim modelu

votes = generic.GenericRelation(Vote) 

a następnie je zsumować:

my_model.objects.annotate(num_votes=Count('votes')) 

W tym przypadku jestem po prostu liczenia liczby głosów otrzymanych przez obiekty, ale można przełączyć Count z Avg, aby uzyskać średnią.

Od this does not work with Django by default zainstalowałem django-generic-aggregation.

+0

dziękuje Paolo za składnię – Bastian

Powiązane problemy