Django Создание левого соединения с новым полем col или empity
мне нужно вывести все элементы, но также мне нужно знать, есть ли у текущего пользователя request.user этот элемент в списке.
с SQL это просто что-то вроде
select * from item as i
Left JOIN UserItems as ui ON ui.item=i.id
left Join user as u ON ui.user=u.id
Итак, мне просто нужно проверить, что u.id не является null, как я должен сделать это в django для получения списка всех элементов?
class User(AbstractUser):
email = models.EmailField(unique=True)
birthday = models.DateField(blank=True, null=True)
class UserItems(models.Model):
item = models.ForeignKey(Item, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
date = models.DateTimeField(auto_now_add=True)
class Item(models.Model):
name = models.CharField(max_length=250 )
created = models.DateTimeField(default=timezone.now)
очевидно, что UserItems.objects.filter(useritem__user=request.user) не получает все предметы
Вы можете аннотировать с помощью Exists подзапроса [Django-doc]:
from django.db.models import Exists, OuterRef
Item.objects.annotate(
user_added=Exists(
UserItems.objects.filter(item_id=OuterRef('pk'), user=request.user)
)
)
Возникающие при этом Item будут иметь дополнительный атрибут user_added, который будет True, если существует UserItems для request.user и который Item и False в противном случае.