2009-03-13 5 views
3
class Domains(models.Model): 
    name = models.CharField(max_length=30) 
    description = models.CharField(max_length= 60) 
    user = models.ManyToManyField("Users", blank=True, null=True) 
    def __unicode__(self): 
     return self.name 

class Groups(models.Model): 
    domain = models.ForeignKey(Domains) 
    name = models.CharField(max_length=30) 
    description = models.CharField(max_length= 60) 
    def __unicode__(self): 
     return self.name 

class Users(models.Model): 
    login = models.CharField(max_length=30, unique=True) 
    group = models.ManyToManyField(Groups, blank=True, null=True) 
    def __unicode__(self): 
     return self.login 

J'ai le modèle ci-dessus. Besoin d'aide pour travailler avec Django ORM. Comment est-ce que je construirais une requête où tous les noms de groupe qui appartiennent seulement aux domaines auxquels appartient un utilisateuraide avec joindre complexe dans Django ORM

Répondre

2

Vous devriez probablement employer des noms singuliers pour vos classes modèles. Par exemple, je réécris les modèles suivants:

class Domain(models.Model): 
    name = models.CharField(max_length=30) 
    description = models.CharField(max_length= 60) 
    user = models.ManyToManyField('User', blank=True, null=True) 

    def __unicode__(self): 
      return self.name 

class Group(models.Model): 
    domain = models.ForeignKey(Domain, related_name='groups') 
    name = models.CharField(max_length=30) 
    description = models.CharField(max_length= 60) 

    def __unicode__(self): 
      return self.name 

class User(models.Model): 
    login = models.CharField(max_length=30, unique=True) 
    group = models.ManyToManyField(Group, related_name='users', blank=True, null=True) 

    def __unicode__(self): 
      return self.login 

Puisque vous avez des utilisateurs directement liés à des groupes, vous n'avez pas besoin d'impliquer les domaines du tout. Pour récupérer tous les noms de groupe pour un utilisateur particulier, vous feriez:.

Group.objects.filter(users__pk=...).values_list('name', flat=True) 

Remplacer « ... » avec l'ID de l'utilisateur que vous êtes intéressé par

+0

J'ai réellement besoin du domaine parce que je veux montrer même les groupes qui ne sont pas associés à un utilisateur mais qui sont associés à un domaine auquel l'utilisateur appartient –

+0

Ah ... J'ai manqué cela. La solution de Jarret est probablement ce dont vous avez besoin alors. – elo80ka

4

I deuxième commentaire de elo80ka sur l'utilisation noms singuliers pour vos modèles. Pour filtrer les groupes par domaine et utilisateur, essayez:

Groups.objects.filter(domain__user=u) 

Ceci effectuera la jointure appropriée entre les plusieurs-à-plusieurs. Comme écrit, la requête retournera des objets de groupe. Si vous voulez uniquement la propriété name, ajoutez le .values_list('name', flat=True) à la requête, comme le suggère elo80ka.

+0

MyUserAdminForm de classe (forms.ModelForm): \t classe Meta: \t \t model = utilisateur \t groupe = forms.ModelMultipleChoiceField ( \t \t queryset = Groups.objects.filter (???), \t \t un widget = forms.CheckboxSelectMultiple, \t) Désolé Jarret..n'a pas compris comment cela fonctionne ... que fait exactement le filtre 'domain__user'? –

+0

Le filtre joint les groupes à la table Utilisateurs via les domaines, de sorte que seuls les groupes dont le «domaine» ForeignKey pointe vers un domaine ayant l'utilisateur «u» dans le champ plusieurs.à.lecteurs de Domain.users. –

+0

Peut-être que cette section dans les docs django rendra plus clair: Jetez un coup d'oeil à ceci dans les docs: http://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships –