我有以下对象(仅针对这个问题进行了简化)
class Object1(models.Model):
users_assigned_to_object1 = models.ManyToMany(Users, related_name='objects')
sub_object = models.ForeignKey(SubObject1)
class Users(models.Model):
first_name = models.CharField(max_length=1000)
class SubObject1(models.Model):
sub_object_name = models.CharField(max_length=1000)
class SubObject2(models.Model):
sub_object_1 = models.ManyToMany(SubObject1)
class SubObject3(models.Model):
sub_object_2 = models.ManyToMany(SubObject3)
role_name = models.CharField(max_length=1000)
user = models.ForeignKey(Users, related_name='sub_object_relation')
由于现在并不重要的更复杂的原因,我需要能够使用分配给对象 1 的用户来注释
Object1
,并且这些用户至少有一个 role_name=ADMIN
模型具有 SubObject3
与 Object1
有关。
例如我正在尝试实现这样的目标:
Object1.objects.annotate(admin_users=X)
X 发生了什么?
我使用 Django 4.2 并使用 Postgres DB
我尝试使用子查询,但它们不使用列表进行响应(这可以返回一个列表),并尝试使用 Django 条件表达式(例如 ArrayAgg、When)执行操作,但无法真正找到正确的解决方案。
看起来您正在寻找
ArraySubquery
。
from django.contrib.postgres.expressions import ArraySubquery
from django.db.models import F, OuterRef
from django.db.models.functions import JSONObject
users = Users.objects.filter(
subobject3__role_name='ADMIN',
subobject3__sub_object_2__sub_object_1=OuterRef('pk')
).annotate(json=JSONObject(id=F('id'), first_name=F('first_name'))
Object1.objects.annotate(admin_users=ArraySubquery(users.values('json'))