【问题标题】:Left Join to the latest row using django使用 django 左连接到最新行
【发布时间】:2020-09-21 16:12:40
【问题描述】:

我有两张桌子。 产品 [id、名称、类别] 销售[产品、日期、价格]

我想从 Sales 中获取具有最新行的每个产品。如果销售中没有行,我仍然想获得该产品行。这些行与外键相关。

进行这种左连接的 Django 方法是什么?

【问题讨论】:

  • 你有代码要分享吗?共享代码时,更容易可视化您想要的内容和帮助

标签: mysql django django-orm


【解决方案1】:

您可以在视图中获取 Sales 对象并在模板中呈现该对象。例如你可以这样做。

models.py

class Course(models.Model):

  name = models.CharField(max_length=100)
  category = models.CharField(max_length=100)


def __str__(self):
    return self.title

class Sales(models.Model):

  product = models.ForeignKey(Course, on_delete=models.CASCADE, null=True)
  price = models.IntegerField()
  date = models.DateTimeField(auto_now_add=True, null=True)

def __str__(self):
    return self.product.title

views.py

order_by(-date) 从数据库中获取最新商品

def sales_view(request):

   sales = Sales.objects.all().order_by(-date)

return render(request, 'template.html', {'sales':sales})

现在,您可以在模板中加载模板。

{% for sale in sales %}

  {{sale.product.name}}
  {{sale.price}}
  {{sale.date}}

{% endfor %}

这样即使没有销售对象,您也可以获得产品对象。希望你能从中得到一些想法。

【讨论】:

    【解决方案2】:

    或许你可以使用Subquery:

    from django.db.models import Subquery, OuterRef
    
    sales = Sales.objects.filter(product=OuterRef('pk')).order_by('-date')
    products = Product.objects.annotate(latest_sale = Subquery(sales.values('price')[:1]))
    

    【讨论】:

    • 这几乎做到了。它让我走上了正轨。谢谢。缺少的部分是 products = Product.objects.all().annotate(latest_sale = Subquery(sales.values('price')[:1])) 非常感谢!
    猜你喜欢
    • 2020-02-05
    • 1970-01-01
    • 2016-10-29
    • 2010-10-18
    • 2021-07-25
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    相关资源
    最近更新 更多