2010-10-08 7 views
1

J'essaie d'obtenir une requête d'un modèle spécifique. J'ai du mal à le faire pour filtrer correctement les données.Filtrage de plusieurs modèles dans les vues django

J'ai déjà corrigé un bogue où il renvoyait d'autres données d'utilisateurs mais maintenant il renvoyait des doublons d'une ligne de données dans le modèle.

events = Event.objects.filter(club=user.get_profile().main_club) | Event.objects.filter(invclub=user.get_profile().main_club) | Event.objects.filter(invited=user) 

C'est la requête que j'essaie d'exécuter.

Le résultat que je visais, est d'avoir tous les événements que l'utilisateur a été soit manuellement invités à (invité) leur club a été invité (invclub) ou leur club est le club hôte (club)

Je suis probablement en train d'aborder ce problème dans la mauvaise direction et il se peut très bien que ce soit une façon plus simple de le faire. Toute aide est grandement appréciée.

EDIT: comms.models

class Event(models.Model): 
    title = models.CharField(max_length='255') 
    club = models.ForeignKey(Club, verbose_name="Host Club") 
    invclub = models.ManyToManyField(Club, verbose_name="Invited Clubs", related_name="Invited Clubs", blank=True) 
    l_desc = models.CharField(max_length='255', verbose_name="Location Description") 
    l_long = models.CharField(max_length='255', verbose_name="Longitude", blank=True) 
    l_lat = models.CharField(max_length='255', verbose_name="Latitude", blank=True) 
    edate = models.DateTimeField(default=datetime.now, verbose_name="Event Date", blank=True) 
    length = models.CharField(max_length='255', verbose_name="Event Length", blank=True) 
    invited = models.ManyToManyField(User, related_name="Invited Users", blank=True) 
    attending = models.ManyToManyField(User, related_name="Attending Users", blank=True) 
    declined = models.ManyToManyField(User, related_name="Declined Users", blank=True) 
    description = models.TextField(blank=True) 

fixe:

solution finale utilise le Q() Objets comme suggéré ci-dessous, tout en ajoutant la fonction .distinct() pour assurer pas de doublons sont renvoyés .

+0

Pouvez-vous également publier vos modèles? Il est difficile de penser à la requête sans les modèles. –

Répondre

5

Ce que vous faites est de prendre trois requêtes indépendantes et de les combiner ensemble. Je suis surpris que cela fonctionne du tout. Au lieu de cela, vous avez besoin d'une requête avec trois critères, qui sont OR-ed ensemble. Vous réalisez ceci dans Django par l'intermédiaire des objets Q():

from django.db.models import Q 
main_club = user.get_profile().main_club 
events = Event.objects.filter(Q(club=umain_club) | Q(invclub=main_club) | Q(invited=user)) 
+0

C'est certainement un moyen plus productif de s'attaquer à ce problème, mais cela ne résout pas les problèmes de duplication que j'éprouve. –

+1

Vous ne pouvez pas simplement ajouter '.distinct()' pour se débarrasser des dupes? –

+0

Cela fonctionne merci meder –

Questions connexes