python - 如何在 Django 中执行此连接查询

标签 python sql django

在 Django 中,我有两个模型:

class Product(models.Model):
    name = models.CharField(max_length = 50)
    categories = models.ManyToManyField(Category)

class ProductRank(models.Model):
    product = models.ForeignKey(Product)
    rank = models.IntegerField(default = 0)

我将排名放在一个单独的表中,因为页面的每个 View 都会导致排名发生变化,我担心所有这些写入会使我的其他(主要是读取)查询变慢。

我从一个简单的查询中收集了一份 Products 列表:

cat = Category.objects.get(pk = 1)
products = Product.objects.filter(categories = cat)

我现在想获得这些产品的所有排名。我更愿意一次完成所有操作(使用 SQL 连接),并且想知道如何使用 Django 的查询机制来表达它。

在 Django 中执行此操作的正确方法是什么?

最佳答案

这可以在 Django 中完成,但是您需要稍微改变一下您的模型:

class Product(models.Model):
    name = models.CharField(max_length=50)
    product_rank = models.OneToOneField('ProductRank')

class ProductRank(models.Model):
    rank = models.IntegerField(default=0)

现在,在获取 Product 对象时,您可以使用 select_related() 在一个查询中遵循一对一关系方法:

Product.objects.filter([...]).select_related()

这将生成一个使用连接获取产品排名的查询:

SELECT "example_product"."id", "example_product"."name", "example_product"."product_rank_id", "example_productrank"."id", "example_productrank"."rank" FROM "example_product" INNER JOIN "example_productrank" ON ("example_product"."product_rank_id" = "example_productrank"."id")

我不得不将 Product 和 ProductRank 之间的关系字段移动到 Product 模型,因为它看起来像 select_related() 仅在一个方向上跟随外键。

关于python - 如何在 Django 中执行此连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/860941/

相关文章:

django 电子邮件消息异常

Django高效查找: Related manager vs whole queryset

python - 使用 Python split 将一个变量拼接在一起

java - 从 Java 或 C# 访问一个用 Python 编写的返回数组的函数

python - XIO : fatal IO error 11 (Resource temporarily unavailable) on X server ":0" after 235 requests (235 known processed) with 0 events remaining

python - 如何在 AppEngine (Python) 中保持请求之间的状态?

sql - 将两列和两行聚合为一

sql - 从 nodejs 连接 oracle

mysql - 从 DATETIME 获取日期。数据库

python - Django 1.8.5 和 Celery 的 ImportError