[英]Django annotate count for another queryset
楷模:
class Regions(models.Model):
name = models.CharField(max_length=255, unique=True)
class Owners(models.Model):
name = models.CharField(max_length=255, null=False, unique=True)
url = models.URLField(null=True)
class Lands(models.Model):
region = models.ForeignKey(Regions, on_delete=models.CASCADE)
owner = models.ForeignKey(Owners, on_delete=models.PROTECT, null=True)
description = models.TextField(max_length=2000, null=True)
class LandChangeHistory(models.Model):
land = models.ForeignKey(Lands, on_delete=models.CASCADE, null=False, related_name='lands')
price = models.IntegerField()
size = models.IntegerField()
date_added = models.DateField(auto_now_add=True)
有效的查詢集,但我需要以某種方式在另一個查詢集中對其進行注釋:
lands_in_region = Lands.objects.values('region__name').annotate(count=Count('region_id'))
返回例如:
{'region__name': '紐約', 'count': 3}, {'region__name': '芝加哥', 'count': 2}
在第二個查詢集中,我需要該地區可用土地的數量。 但不是真正的計數,我總是得到計數 = 1。如何組合它們? 我很確定我可以通過在字段“region__id”上加入兩個表來在原始 sql 中做到這一點,但不知道如何在 django orm 中做到這一點。
f = LandFilter(request.GET, queryset=LandChangeHistory.objects.all()
.select_related('land', 'land__region', 'land__owner')
.annotate(usd_per_size=ExpressionWrapper(F('price') * 1.0 / F('size'), output_field=FloatField(max_length=3)))
.annotate(count=Count('land__region_id'))
)
例如。 如果返回:
土地1 | 100 美元 | 100平方米 | 紐約
土地2 | 105 美元 | 105平方米| 紐約
土地3 | 102 美元 | 102平方米 | 芝加哥
我還需要 1 列,計算每塊土地有多少紐約和芝加哥
土地1 | 100 美元 | 100平方米 | 紐約 | 2
土地2 | 105 美元 | 105平方米| 紐約 | 2
土地3 | 102 美元 | 102平方米 | 芝加哥 | 1
這對我有用。 希望能幫助某人。
首先,我嘗試在過濾器之后立即調用 Count() 方法,但這會破壞查詢,因為它會立即嘗試從數據庫中獲取數據。 但這是正確的思考方式,所以我添加了 count annotate 並選擇了它,它起作用了。
f = LandFilter(request.GET, queryset=LandChangeHistory.objects.all()
.select_related('land', 'land__region', 'land__owner')
.annotate(usd_per_size=ExpressionWrapper(F('price') * 1.0 / F('size'), output_field=FloatField(max_length=3)))
.annotate(count=Subquery(
Lands.objects.filter(region_id=OuterRef('land__region_id'))
.values('region_id')
.annotate(count=Count('pk'))
.values('count')))
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.