【发布时间】:2022-07-19 04:43:20
【问题描述】:
我尝试执行此操作已经有几个小时了,但我无法弄清楚。
假设我有一个 Django 项目,其中包含两个这样的类:
from django.db import models
class Person(models.Model):
name=models.CharField()
address=models.ManyToManyField(to=Address)
class Address(models.Model):
city=models.CharField()
zip=models.IntegerField()
所以它只是一个具有多个地址的简单 Person。 然后我创建了一些对象:
addr1=Address.objects.create(city='first', zip=12345)
addr2=Address.objects.create(city='second', zip=34555)
addr3=Address.objects.create(city='third', zip=5435)
person1=Person.objects.create(name='person_one')
person1.address.set([addr1,addr2])
person2=Person.objects.create(name='person_two')
person2.address.set([addr1,addr2,addr3])
现在是最困难的部分,我想做一个查询,它会返回类似的内容:
result = [
{
'name': 'person_one',
'addresses': [
{
'city':'first',
'zip': 12345
},
{
'city': 'second',
'zip': 34555
}
]
},
{
'name': 'person_two',
'addresses': [
{
'city':'first',
'zip': 12345
},
{
'city': 'second',
'zip': 34555
},
{
'city': 'third',
'zip': 5435
}
]
}
]
我能得到的最好的结果是对 Django 使用 ArrayAgg 和 JSONBagg 运算符(顺便说一下,我正在使用 POSTGRESQL):
from django.contrib.postgres.aggregates import JSONBAgg, ArrayAgg
result = Person.objects.values(
'name',
addresses=JSONBAgg('city')
)
但这还不够,我不能像我想做的那样直接从查询中提取一些字典,只是一个值列表或无用的使用:
addresses=JSONBAgg(('city','zip'))
它返回一个带有随机键和我作为输入作为值传递的字符串的字典。
谁能帮帮我?
谢谢
【问题讨论】:
-
我认为 DRF 序列化程序可能会帮助您:django-rest-framework.org/api-guide/serializers。另外,据我所知,不知道为什么你有M2M for Person -> Address 关系,那不应该是一对多吗?
标签: python django django-queryset aggregation