Аннотация Django для использования левого соединения
Модели:
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'
)
Потребности:
Сталь, возвращающая те же самые 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
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')
)