代码之家  ›  专栏  ›  技术社区  ›  tread

Django多对多通过查询简化?

  •  0
  • tread  · 技术社区  · 8 年前

    我有一个 Project , User 还有一个多对多的表格叫做 ProjectMembership :

    class Project(models.Model):
        '''Project model
        '''
        name = models.CharField(max_length=255, unique=True)
        users = models.ManyToManyField(
            settings.AUTH_USER_MODEL,
            through='ProjectMembership'
        )
        is_active = models.BooleanField(
            default=True,
        )
    
    class User(AbstractBaseUser, PermissionsMixin):
        email = models.EmailField(unique=True, null=True)
        is_active = models.BooleanField(
            default=True,
        )
        projects = models.ManyToManyField(
            Project,
            through=ProjectMembership
        )
    
    class ProjectMembership(models.Model):
        '''Project Membership model
        '''
        user = models.ForeignKey(
            settings.AUTH_USER_MODEL,
            on_delete=models.PROTECT
        )
        project = models.ForeignKey(Project, on_delete=models.PROTECT)
        is_project_manager = models.BooleanField(default=False)
    

    现在,我想要一个特定用户所在的所有活动项目上的所有活动项目经理的列表。我在下面使用了以下查询和循环,但也许有一种方法可以在不使用循环的情况下做到这一点?

        projects = self.leave_not_required_user.projects.filter(is_active=True)
        users = []
        for project in projects:
            project_memberships = project.projectmembership_set.filter(
                is_project_manager=True,
                user__is_active=True
            ).all()
            for project_membership in project_memberships:
                users.append(project_membership.user)
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Adem Öztaş    8 年前

    你可以这样试试,

    memberships = ProjectMembership.objects.filter(
         user__is_active=True, is_project_manager=True,      
         project__is_active=True
    )
    
    users = [membership.user for membership in memberships]