在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)
我把排名放在一个单独的表中,因为页面的每个视图都会导致排名发生变化,我担心所有这些写入会使我的其他(主要是读取)查询变慢。
我通过一个简单的查询收集了Products
的列表:
cat = Category.objects.get(pk = 1)
products = Product.objects.filter(categories = cat)
现在我想得到这些产品的所有排名,我更喜欢一次完成(使用SQL连接),并且想知道如何使用Django的查询机制来表达。
在Django中,正确的方法是什么?
4条答案
按热度按时间im9ewurl1#
这可以在Django中完成,但是你需要稍微改变一下你的模型:
现在,在获取Product对象时,可以使用select_related()方法在一个查询中跟踪一对一关系:
这将生成一个使用连接获取产品排名的查询:
我不得不将Product和ProductRank之间的关系字段移到Product模型中,因为看起来select_related()只在一个方向上跟随外键。
egmofgnx2#
我没有检查,但是:
应该抓住每一个示例。
qoefvg9y3#
对于Django 2.1来自文档
此示例检索名称为'Beatles Blog'的Blog的所有Entry对象:
文档URL https://docs.djangoproject.com/en/2.1/topics/db/queries/
idv4meu84#
向
QuerySet
的select_related()
方法添加一个调用,虽然我不确定是否能在两个方向上获取引用,但这是最有可能的答案。