django - 什么是原始 SQL 的模型查询
问题描述
我正在研究某种价目表,价格会随着时间而变化。我在检索每种产品的最新价格时遇到问题。
我的模型如下:
from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator
class Product(models.Model):
id = models.PositiveIntegerField(primary_key=True, validators=[MinValueValidator(10000), MaxValueValidator(99999)])
name = models.CharField(max_length=100, null=False, blank=False)
def __str__(self):
return f'[{self.id}] {self.name}'
class ProductPart(models.Model):
product = models.ForeignKey('Product', on_delete=models.CASCADE, null=False)
price = models.DecimalField(decimal_places=2, max_digits=7, null=False)
date_created = models.DateTimeField(auto_now_add=True)
date_changed = models.DateTimeField(auto_now=True)
我有一个原始的 SQL 变体,但不知道如何将它变成 Django 查询。
原始查询是:
select
pp.id as product_id,
pp.name as product_name,
ppp.price as price
from
pricelist_Product as pp
inner join pricelist_ProductPart as ppp
on pp.id=ppp.product_id
where
(pp.id, ppp.id) in
(
select
pp.product_id,
max(pp.id)
from
pricelist_ProductPart as pp
group by
pp.product_id
)
请帮帮我。
解决方案
Django 实际上为此提供了一个选项:请参阅此处的 Django 文档。
raw()
您可以这样使用它:
for i in Product.objects.raw("SELECT * FROM myapp_products"):
print(i)
您可以在 Django Shell 中对其进行测试。希望有帮助!
推荐阅读
- c++ - 如何避免没有谓词的虚假唤醒?
- android - Livedata 和 ViewModel 更新无限次
- javascript - contentEditable 默认模板新行
- loops - 如何在 Shopify 液体中合并两个集合而不将其更改为数组?
- amazon-web-services - 在 EC2 AWS 实例中添加 Jenkins 用户和组
- javascript - 导航栏状态 - 手动从正常状态更改为折叠状态
- android - 如何将 Flutter 应用的构建过程与 Rust 代码集成?即构建Flutter代码时,如何自动构建其Rust代码?
- python-3.x - AttributeError:“列表”对象没有属性“查找”
- javascript - 点击导航栏消失
- python-sphinx - 一种让 Sphinx 文档小节开始新页面的方法?