2017-10-09 4 views
0

J'ai un groupe de stations appartenant à des groupes. Chaque station peut être dans plusieurs groupes. Ce modèle est le (simplifié):Interroger des relations ManyToMany

class Station(models.Model): 
    name = models.CharField(max_length=4, blank=False, primary_key=True) 

    def __str__(self): 
     return "Station " + self.name 



class StationGroup(models.Model): 
    name = models.CharField(max_length=100, blank=False, primary_key=True) 
    stations = models.ManyToManyField(Station) 

    def __str__(self): 
     return "Station group " + self.name 

Comment puis-je obtenir une liste/queryset contenant

  1. stations qui ne sont pas dans un groupe
  2. stations qui sont dans les groupes N
  3. la intersection, union et différence de N stationGroupes

?

(Suggestions pour un meilleur titre de la question sont les bienvenus)

Répondre

2

Pas dans un groupe:

Station.objects.filter(stationgroup=None) 

en groupe N:

Station.objects.annotate(group_count=Count('stationgroup')).filter(group_count=N) 

intersection/différence - il n'y a pas de construction -des façons de le faire. Une possibilité consiste simplement à interroger les groupes, les convertir en ensembles et faire les comparaisons en Python. Ou, vous pouvez écrire query expressions personnalisé pour faire ce que vous voulez.

1

Pour ajouter à la réponse de Daniel, pour obtenir des objets qui se trouvent dans une quelconque d'une liste de groupes, vous ne

Station.objects.filter(stationgroup=g1).filter(stationgroup=g2).filter(stationgroup=g3) 

Docs Here