Django 使用新的颜色空字段进行左连接

Django Make a Left Join with new col or empity field

我需要打印所有项目,但我还需要知道当前用户 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 是否不为空,我如何使用 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 subquery [Django-doc] 进行注释:

from django.db.models import <strong>Exists</strong>, OuterRef

Item.objects.annotate(
    user_added=<strong>Exists(</strong>
        UserItems.objects.filter(item_id=OuterRef('pk'), user=request.user)
    <strong>)</strong>
)

由此产生的 Item 将有一个额外的属性 user_addedTrue 如果 request.user 存在 UserItems 并且ItemFalse 否则。