【问题标题】:How to combine two query sets into a dict like object?如何将两个查询集组合成一个类似字典的对象?
【发布时间】:2018-09-10 14:30:15
【问题描述】:

我正在使用 django 和 javascript,我需要将字典的 JSON 发送到 javascript。这需要将两个不同的 django 查询集组合成一个类似对象的字典

我试过了:

from itertools import chain
import json
checkin = Checkins.objects.get(checkinno=1)
checksins = (Checkins.objects.filter(checkinno=1).values('checkinno', 'date', 'time', 'consulted', 'closed'))
custid = checkin.hospitalid.cstid
checks = (customer.objects.filter(cstid=custid).values('name', 'age', 'gender', 'mobile', 'email', 'address'))
result_list = list(chain(checksins, checks))
print(result_list)

我明白了:

[{
    'checkinno': 1,
    'date': datetime.date(2018, 9, 10), 
    'time': '6:10 PM', 
    'consulted': 0,
    'closed': 0
}, 
{
    'name': 'Jeff',
    'age': 5, 
    'gender': 'male',
    'mobile': '000000',
    'email': '', 'address': ''
}]

我想要什么:

[
    'checkinno': 1,
    'date': datetime.date(2018, 9, 10),
    'time': '6:10 PM',
    'consulted': 0, 
    'closed': 0,
    'name': 'Jeff',
    'age': 5, 
    'gender': 'male',
    'mobile': '000000', 
    'email': '', 
    'address': ''
]

【问题讨论】:

  • 第二个的语法有点偏离:语法“组合”列表和字典。
  • 此外,如果两个(或更多)字典共享相同的键会发生什么?由于 Python 字典将键映射到 one 值,这可能会导致很多麻烦。
  • 他们不会共享相同的密钥。这是一个 django 模型,第二个通过外键与第一个相关
  • 请说明您是否需要在不评估查询的情况下完成此操作。
  • 好吧,严格来说,您可能有一个City 和一个Country,它们都具有name 属性。因此,这些通过FK 关联的事实并不能解决问题。

标签: python django python-3.x list dictionary


【解决方案1】:

你能不能把这个a = {**b, **c}用在result_list上?

其中aresult_listb/c 代表您要合并的字典。

【讨论】:

  • 很高兴为您提供帮助!
【解决方案2】:

如果您使用django-rest-framework 制作API,the docs 说明如何完成它:

class CustomerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Customer
        fields = ('name', 'age', 'gender', 'mobile', 'email', 'address')

class CheckinsSerializer(serializers.ModelSerializer):
    custid = CustomerSerializer(read_only=True)

    class Meta:
        model = Checkins
        fields = ('checkinno', 'date', 'time', 'consulted', 'closed', 'custid')

然后你测试我:

>>> checkin = Checkins.objects.get(checkinno=1)
>>> serializer = CheckinsSerializer(instance=checkin)
>>> serializer.data

【讨论】:

    【解决方案3】:

    我这样解决了我的问题。我确信有一种更 Pythonic 的方式来做到这一点。

    from itertools import chain
    checkin = Checkins.objects.get(checkinno=1)
    checksins = (Checkins.objects.filter(checkinno=1).values('checkinno', 'date', 'time', 'consulted', 'closed'))
    custid = checkin.hospitalid.cstid
    checks = (customer.objects.filter(cstid=custid).values('name', 'age', 'gender', 'mobile', 'email', 'address'))
    result_list = list(chain(checksins, checks))
    res = {**result_list[0], **result_list[1]} 
    print(res)
    

    输出:

    {'checkinno': 1, 'date': datetime.date(2018, 9, 10), 'time': '6:10 PM', 'consulted': 0, 'closed': 0, 'name': 'Jeff', 'age': 5, 'gender': 'male', 'mobile': '8610651871', 'email': '', 'address': ''}
    

    【讨论】:

    • 正如我所说,这可能是xy problem。看来您真正需要的不是合并字典,而是外键的嵌套序列化。
    • @RodrigoRodrigues 可能是这样。 :) 但我想我已经解释了我想要做什么。
    • 您是否使用 django-rest-framework 来生成 API?
    猜你喜欢
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 2012-11-27
    • 2015-10-08
    • 2018-08-07
    • 2022-01-12
    相关资源
    最近更新 更多