使用左连接的 Django 注释

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

型号:

class Operator_online(models.Model):
    name             =  models.TextField()
    role             =  models.TextField()

class Reservations(models.Model):
    consultant_id     = models.ForeignKey(Operator_online, on_delete=models.CASCADE)
    voip_number       = models.IntegerField()

尝试过:

consultants_operators = Operator_online.objects.filter(
    Q(role='consultant') | Q(role='support'), status='1'
)

consultant_id_queryset = Reservations.objects.filter(
    consultant_id__in=consultants_operators
).select_related('consultant_id').annotate(role=F('consultant_id__role')).values(
    'consultant_id',
    'consultant_id__name',
    'voip_number',
    'role'
)

需求:

Steel 返回与上面相同的

consultant_id_queryset
查询集值:

返回所有已创建的

Operator_online
(即
role
name
字段)加上现有的已分配
Reservations
(即
consultant_id
voip_number
反对 在返回之前仅存在的
Reservations
已分配实例
 Operator_online

因此,对于未建立的

Reservations
实例,其
consultant_id
字段 (
foreignkey
) 与
Operator_online
返回
null
voip_number
consultant_id

django django-models
1个回答
0
投票
consultants_operators = Operator_online.objects.filter(
    Q(role='consultant') | Q(role='support'), status='1'
)

reservations_id_subquery = Reservations.objects.filter(
    consultant_id=OuterRef('pk')
).values('id')[:1]

reservations_subquery = Reservations.objects.filter(
    consultant_id=OuterRef('pk')
).values('voip_number')[:1]

consultant_id_queryset = consultants_operators.annotate(
     reservation_consultant_id=Coalesce(Subquery(reservations_id_subquery), Value(None)),
    reservation_voip_number=Coalesce(Subquery(reservations_subquery), Value(None))
).values(
    'role',
    'reservation_voip_number',
    'reservation_consultant_id',
    consultant_id__name=F('name')
)

尝试工作正常,但我看到的问题是将最后一个查询集字段命名为相同的波纹管,并抛出与响应相同的波纹管:

"The annotation 'voip_number' conflicts with a field on the model."

发出的尝试

consultant_id_queryset = consultants_operators.annotate(
    reservation_consultant_id=Coalesce(Subquery(reservations_id_subquery), Value(None)),
    reservation_voip=Coalesce(Subquery(reservations_voip_subquery), Value(None))
).values(
    'role',
    consultant_id=F('reservation_consultant_id'),
    voip_number=F('reservation_voip'),
    consultant_id__name=F('name')
)
© www.soinside.com 2019 - 2024. All rights reserved.