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_added
即 True
如果 request.user
存在 UserItems
并且Item
和 False
否则。
我需要打印所有项目,但我还需要知道当前用户 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_added
即 True
如果 request.user
存在 UserItems
并且Item
和 False
否则。