Django 4.0 - 尝试 运行 基于另一个查询结果的查询

Django 4.0 - Trying to run a query based on result from another query

伙计们!

这是我正在尝试做的事情: 我有一个 User 模型,一个 LinkedOrganization 模型,一个 Organization 模型,如下所示:

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(db_index=True, unique=True)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    mobile = models.CharField(max_length=12)

    is_staff =  models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_superuser = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name', 'mobile']

    class Meta:
        verbose_name = 'User'
        verbose_name_plural = 'Users'

# Organization fields
class Organization(models.Model):
    organization_name = models.CharField(max_length=50, unique=True)
    
    def __str__(self):
        return self.organization_name

class LinkedOrganization(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='linked_user')
    organization = models.ForeignKey(Organization, on_delete=models.CASCADE, related_name='linked_organization')
    is_manager = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)
    class Meta:
        unique_together = (
            ("user", "organization")
        )

在我的 API 视图中,我正在尝试 return 链接到请求者是其经理的组织的所有用户。

现在,一个请求者可以是 1 个或多个组织的经理,我需要让所有用户链接到这些组织。这意味着我需要它是某种 'is member of organization A' 或 'is member of organization B',并遍历所有组织。是否可以使用 Django 中的查询集来执行此操作?

我在写这篇文章时意识到我可以只获取组织并使用 ReverseObjectManager 获取组织的用户并遍历这些组织并在 Python 中制作我需要的词典,但是如果得到一个查询并在查询集中使用结果是 Django 的一个函数,这样会更容易。

您可能会受益于略有不同的数据库模式,不仅针对此查询,而且一般而言。考虑以下因素:

class User(AbstractBaseUser, PermissionsMixin):
    email        = models.EmailField(db_index=True, unique=True)
    first_name   = models.CharField(max_length=50)
    last_name    = models.CharField(max_length=50)
    mobile       = models.CharField(max_length=12)
    organization = models.ForeignKey('Organization', on_delete=models.CASCADE, related_name='user_organization')
    is_staff     = models.BooleanField(default=False)
    is_active    = models.BooleanField(default=True)
    is_superuser = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name', 'mobile']

    class Meta:
        verbose_name = 'User'
        verbose_name_plural = 'Users'

# Organization fields
class Organization(models.Model):
    organization_name = models.CharField(max_length=50, unique=True)
    manager           = models.ForeignKey(User, etc...)
    
    def __str__(self):
        return self.organization_name

在这种情况下,每个用户都有一个组织,每个组织都有一个经理。简单的。另请注意,我在外键字段中将 'Organization' 引用为字符串,因为它是在定义组织模型的上方声明的。有了它,您可以这样查询:

managed_users = User.objects.filter(user_organization__manager=request.user)

一种常见的做法是为用户创建个人资料模型,可以在其中添加其他字段,例如他们的组织、联系信息等。在那种情况下,你会有这样的东西:

class Profile(models.Model):
    user         = models.OneToOneField(User, on_delete=models.CASCADE)
    organization = models.ForeignKey(Organization, etc...)