【问题标题】:help with complex join in Django ORM帮助在 Django ORM 中进行复杂的连接
【发布时间】:2010-10-13 05:53:41
【问题描述】:
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 时需要一些帮助。 我将如何构建查询以返回仅属于用户所属域的所有组名称

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    我赞同 elo80ka 关于为模型使用单数名称的评论。要按域和用户过滤组,请尝试:

    Groups.objects.filter(domain__user=u)
    

    这将在多对多中执行适当的连接。如所写,查询将返回组对象。如果您只需要 name 属性,请按照 elo80ka 的建议将 .values_list('name', flat=True) 附加到查询中。

    【讨论】:

    • class MyUserAdminForm(forms.ModelForm): class Meta: model = Users group = forms.ModelMultipleChoiceField(queryset=Groups.objects.filter(???), widget=forms.CheckboxSelectMultiple, ) 对不起 Jarret ..不明白这是如何工作的......过滤器“domain__user”到底是做什么的?
    • 过滤器通过域将组连接到用户表,因此您只会获得其“域”外键指向在 Domain.users 中有用户“u”的域的组-对多字段。
    • 也许 django 文档中的这一部分会更清楚:在文档中看看这个:docs.djangoproject.com/en/dev/topics/db/queries/…
    • 只是想弄清楚 = 符号右侧的内容。 class MyUserAdminForm(forms.ModelForm): class Meta: model = Users group = forms.ModelMultipleChoiceField(queryset=Groups.objects.filter(domain__user=???), widget=forms.CheckboxSelectMultiple, )
    • 我正在尝试过滤我在 ModelForm 中为每个用户看到的列表中的组
    【解决方案2】:

    您可能应该为模型类使用单数名称。例如,我会将模型重写为:

    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)
    

    将“...”替换为您感兴趣的用户的 ID。

    【讨论】:

    • 我实际上需要域,因为我什至想显示那些不与用户关联但与用户所属域关联的组
    • 啊...我错过了。那时你可能需要 Jarret 的解决方案。
    猜你喜欢
    • 2017-09-13
    • 2011-04-11
    • 1970-01-01
    • 2011-06-15
    • 2012-10-23
    • 2016-04-17
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多