Django 内部加入
Django inner join on
首先,我想说我已经检查了所有类似的问题,其中 none 个是我问题的答案。
我有 Friend
和 User
个模型。
朋友模型
class Friend(models.Model):
id = models.BigAutoField(primary_key=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, unique=False, related_name='%(class)s_requests_created')
following = models.ForeignKey(User, on_delete=models.CASCADE, unique=False, null=True, blank=True)
accepted = models.BooleanField(default=False)
deleted_at = models.DateTimeField(null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
用户模型
class User(AbstractBaseUser):
id = models.BigAutoField(primary_key=True)
username = models.CharField(max_length=30, unique=True)
email = models.EmailField(max_length=191, unique=True)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30, blank=True)
is_active = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True)
假设有 3 个用户。用户 A、B、C。B
关注 A
,C
关注 B
。 (我是 C
) 我想要实现的是根据关注用户 A
的用户 B
获取用户 A
.
非常简单的查询,但使用 Django QuerySet 有点复杂。
这是我的查询
SELECT U2.username FROM `accounts_friend`
INNER JOIN `accounts_user` U1 ON accounts_friend.following_id = U1.id AND U1.is_active = 1
INNER JOIN `accounts_friend` F1 ON accounts_friend.following_id = F1.user_id AND F1.accepted = 1 AND F1.deleted_at IS NULL AND F1.user_id != F1.following_id
INNER JOIN `accounts_user` U2 ON F1.following_id = U2.id AND U2.is_active = 1
WHERE accounts_friend.accepted = 1 AND accounts_friend.deleted_at IS NULL AND accounts_friend.user_id != accounts_friend.following_id
这是我所做的,但绝对没有完成。
users = Friend.objects.filter(
Q(user=request.user) & Q(accepted=True) & Q(deleted_at__isnull=True) & Q(following__is_active=True) & ~Q(following=request.user)
).annotate(
username=F('following__friend__following__username')
).values('username')
如果有什么不清楚的地方,请让我知道以添加更多详细信息。
您可以查询这样的 User
个对象:
User.objects.filter(
~Q(friend__user_id=F('pk')),
~Q(friend__user__friend__user_id=F('friend__user_id')),
is_active=True,
friend__accepted=True,
friend__deleted_at=None,
friend__user__is_active=True,
friend__user__friend__accepted=True,
friend__user__friend__deleted_at=None,
friend__user__friend__user=request.user
)
通常查询 模型对象 比查询数据库值更好。由于模型对象是 "richer":它们具有定义的行为,可以轻松传递以执行处理。
以下查询应该为您提供所有 Users
后跟 user
User.objects.filter(
is_active=True,
friend__user=request.user,
friend__accepted=True,
friend__deleted_at__isnull=True
)
首先,我想说我已经检查了所有类似的问题,其中 none 个是我问题的答案。
我有 Friend
和 User
个模型。
朋友模型
class Friend(models.Model):
id = models.BigAutoField(primary_key=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, unique=False, related_name='%(class)s_requests_created')
following = models.ForeignKey(User, on_delete=models.CASCADE, unique=False, null=True, blank=True)
accepted = models.BooleanField(default=False)
deleted_at = models.DateTimeField(null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
用户模型
class User(AbstractBaseUser):
id = models.BigAutoField(primary_key=True)
username = models.CharField(max_length=30, unique=True)
email = models.EmailField(max_length=191, unique=True)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30, blank=True)
is_active = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True)
假设有 3 个用户。用户 A、B、C。B
关注 A
,C
关注 B
。 (我是 C
) 我想要实现的是根据关注用户 A
的用户 B
获取用户 A
.
非常简单的查询,但使用 Django QuerySet 有点复杂。
这是我的查询
SELECT U2.username FROM `accounts_friend`
INNER JOIN `accounts_user` U1 ON accounts_friend.following_id = U1.id AND U1.is_active = 1
INNER JOIN `accounts_friend` F1 ON accounts_friend.following_id = F1.user_id AND F1.accepted = 1 AND F1.deleted_at IS NULL AND F1.user_id != F1.following_id
INNER JOIN `accounts_user` U2 ON F1.following_id = U2.id AND U2.is_active = 1
WHERE accounts_friend.accepted = 1 AND accounts_friend.deleted_at IS NULL AND accounts_friend.user_id != accounts_friend.following_id
这是我所做的,但绝对没有完成。
users = Friend.objects.filter(
Q(user=request.user) & Q(accepted=True) & Q(deleted_at__isnull=True) & Q(following__is_active=True) & ~Q(following=request.user)
).annotate(
username=F('following__friend__following__username')
).values('username')
如果有什么不清楚的地方,请让我知道以添加更多详细信息。
您可以查询这样的 User
个对象:
User.objects.filter(
~Q(friend__user_id=F('pk')),
~Q(friend__user__friend__user_id=F('friend__user_id')),
is_active=True,
friend__accepted=True,
friend__deleted_at=None,
friend__user__is_active=True,
friend__user__friend__accepted=True,
friend__user__friend__deleted_at=None,
friend__user__friend__user=request.user
)
通常查询 模型对象 比查询数据库值更好。由于模型对象是 "richer":它们具有定义的行为,可以轻松传递以执行处理。
以下查询应该为您提供所有 Users
后跟 user
User.objects.filter(
is_active=True,
friend__user=request.user,
friend__accepted=True,
friend__deleted_at__isnull=True
)