Help with complex joins in Django ORM

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

I have a model above. Need some help working with ORM Django. How would I build a query, returns all group names that belong only to the domains to which the user belongs.

+3
source share
2 answers

The second elo80ka comment about using unique names for your models. To filter groups by domain and user, try:

Groups.objects.filter(domain__user=u)

This will result in an appropriate mix with many of the many. As written, the query returns group objects. If you want only the name property, add .values_list('name', flat=True)to the request, as elo80ka suggests.

+4
source

, . , :

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

, , . , :

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

"..." .

+2

Source: https://habr.com/ru/post/1704740/


All Articles