型号:
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'))
返回例如:
{'地区名称':'纽约','计数':3},{'区域名称':"芝加哥","计数":2}
在第二个查询集中,我需要区域中可用土地的计数。但我总是得到count=1,而不是真正的count。如何组合它们?我很确定我可以在原始sql中通过连接字段"上的两个表来完成这项工作;region_id";,但不知道如何在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'))
)
例如。如果返回:
land1|100$|100m2|纽约
land2|105$|105m2|纽约
土地3 |102$|102m2|芝加哥
我还需要一个专栏,每片土地有多少纽约和芝加哥的
land1|100$|100m2|New York|2
land2|105$|105m2|纽约|2
土地3 |102$|102m2|芝加哥|1
这对我很有效。希望能帮助别人。
首先,我试图简单地在filter之后调用Count((方法,但这破坏了查询,因为它试图立即从DB中获取数据。但这是正确的思考方式,所以我添加了count注释并选择了它,它起到了作用。
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')))
)