问题:是否可以使用 Django ORM/queryset 函数完成过滤左连接或子查询连接(在 postgres 中非常简单)?
模型:
class User(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=256)
class DashboardItem(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=256)
class DashboardItemUserData(models.Model):
id = models.AutoField(primary_key=True)
user = models.ForeignKey(User)
dashboard_item = models.ForeignKey(DashboardItem)
is_favorite = BooleanField()
DashboardItemUserData 存储有关用户是否已“收藏”仪表板项的每个用户信息。我需要能够根据当前请求用户对 DashboardItem 进行排序。但是,我需要过滤连接,因为无论其他用户是否“收藏”了该项目,排序都应尊重当前用户。
我认为可行的查询(或类似的):
current_user = request.user
DashboardItem.objects.annotate(is_favorite=DashboardItemUserData.objects.filter(user=current_user).values('is_favorite')).order_by('is_favorite','name')
下面是我会在 SQL 中做的事情:
最佳答案
DashboardItemUserData.objects.filter(user_id=1).\
annotate(name=dashboard_item__name).\
order_by('is_favorite', 'name')
如果这是一个 LEFT 连接,子查询就有意义了。或者如果它包含 TOP/LIMIT。
关于python - Django ORM - 通过过滤的外键关系查询集顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56550858/