【问题标题】:What's the model query of a raw SQL什么是原始 SQL 的模型查询
【发布时间】:2019-08-19 13:09:46
【问题描述】:

我正在制作某种价目表,价格会随着时间而变化。 我在检索每种产品的最新价格时遇到问题。

我的模型如下:

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-queryset


    【解决方案1】:

    Django 实际上为此提供了一个选项: 见Django Documentation here

    raw()
    

    你可以这样使用它:

    for i in Product.objects.raw("SELECT * FROM myapp_products"):
        print(i)
    

    您可以在 Django Shell 中对其进行测试。希望对您有所帮助!

    【讨论】:

      【解决方案2】:

      ORM 可以使用子查询来做到这一点

      from django.db.models import Subquery, OuterRef
      
      subquery = Subquery(ProductPart.objects.
                          filter(product_id=OuterRef('pk')).
                          order_by('-date_created').  # Can order by date_changed or id if you want
                          values('price')[:1])
      
      Product.objects.annotate(most_recent_price=subquery)
      

      【讨论】:

        猜你喜欢
        • 2020-02-09
        • 1970-01-01
        • 2016-04-28
        • 2018-12-21
        • 2021-03-22
        • 1970-01-01
        • 2022-01-11
        • 1970-01-01
        • 2017-05-04
        相关资源
        最近更新 更多