Вопрос: Можно ли выполнить отфильтрованное левое соединение или объединение в подзапросе (очень простое в postgres) с помощью функций Django ORM / queryset?
Модели:
class User(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=256)
class DashboardItem(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=256)
class DashboardItemUserData(models.Model):
id = models.AutoField(primary_key=True)
user = models.ForeignKey(User)
dashboard_item = models.ForeignKey(DashboardItem)
is_favorite = BooleanField()
DashboardItemUserData хранит информацию для каждого пользователя о том, «одобрил» ли пользователь элемент панели мониторинга.Мне нужно иметь возможность сортировать DashboardItem на основе текущего запрашивающего пользователя.Однако мне нужно, чтобы объединение было отфильтровано, так как порядок должен уважать текущего пользователя, независимо от того, «одобрили» ли другие пользователи элемент или нет.
Запрос, который, я думаю, будет работать (или аналогично):
current_user = request.user
DashboardItem.objects.annotate(is_favorite=DashboardItemUserData.objects.filter(user=current_user).values('is_favorite')).order_by('is_favorite','name')
Вот что я бы сделал в SQL:
запрос postgres, используя where при объединении
запрос postgres, используя подзапрос