помогите со сложным объединением в Django ORM - PullRequest
3 голосов
/ 13 марта 2009
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

У меня есть модель выше. Нужна была некоторая помощь в работе с Django ORM. Как мне построить запрос, возвращает все имена групп, которые принадлежат только тем доменам, к которым принадлежит пользователь

Ответы [ 2 ]

4 голосов
/ 13 марта 2009

Я второй комментарий elo80ka об использовании уникальных имен для ваших моделей. Чтобы отфильтровать группы по домену и пользователю, попробуйте:

Groups.objects.filter(domain__user=u)

Это выполнит соответствующее объединение «многие ко многим». Как написано, запрос вернет групповые объекты. Если вам нужно только свойство name, добавьте .values_list('name', flat=True) к запросу, как предлагает elo80ka.

2 голосов
/ 13 марта 2009

Вероятно, вы должны использовать единичные имена для ваших моделей классов. Например, я бы переписал модели как:

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)

Замените '...' идентификатором интересующего вас пользователя.

...