簡體   English   中英

Django 為另一個查詢集注釋計數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM