用与其相关但被过滤的对象列表来注释对象

问题描述 投票:0回答:1

我有以下对象(仅针对这个问题进行了简化)

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)执行操作,但无法真正找到正确的解决方案。

django postgresql conditional-operator django-annotate django-subquery
1个回答
0
投票

看起来您正在寻找

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'))
© www.soinside.com 2019 - 2024. All rights reserved.