python - Django ORM - 通过过滤的外键关系查询集顺序

标签 python django postgresql

问题:是否可以使用 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 中做的事情:

postgres query using where on join

postgres query using subquery

最佳答案

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/

相关文章:

python - 将 jpeg 字符串转换为 PIL 图像对象

django - <title> {% block title %} Home {% endblock %} </title> 没有被其他页面覆盖?

django - 如何使用自定义表单将自定义页面添加到 django admin,与任何模型无关?

django - NOAUTH 需要身份验证。 docker compose for django 上的 Redis 设置

sql - 如何将sql整数查询结果限制为<=1

python - 在多级 DataFrame 上使用 pandas apply 函数

python - 为什么 PySide 仍然需要 QString 作为 textChanged SIGNAL?

python - 使用类然后调用类时出错

c++ - 如何使用 Libpqxx 访问存储在 Postgres 中的多边形点?

xml - PostgreSQL xpath 来选择具有最近的子日期属性的元素