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 в противном случае.

Вернуться на верх