使用 django 左加入到最新行
Left Join to the latest row using django
我有两张桌子。
产品 [id, 名称, 类别]
销售额 [产品、日期、价格]
我想从 Sales 获取每个产品的最新行。如果没有销售行,我仍然想获得该产品行。这些行与外键相关。
Django 做这种左连接的方法是什么?
您可以在视图中获取销售对象并在模板中呈现该对象。例如你可以这样做。
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 %}
即使没有销售对象,您也可以通过这种方式获得产品对象。希望你能从中得到一些启发。
也许你可以使用 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]))
我有两张桌子。 产品 [id, 名称, 类别] 销售额 [产品、日期、价格]
我想从 Sales 获取每个产品的最新行。如果没有销售行,我仍然想获得该产品行。这些行与外键相关。
Django 做这种左连接的方法是什么?
您可以在视图中获取销售对象并在模板中呈现该对象。例如你可以这样做。
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 %}
即使没有销售对象,您也可以通过这种方式获得产品对象。希望你能从中得到一些启发。
也许你可以使用 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]))