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...)
伙计们!
这是我正在尝试做的事情: 我有一个 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...)