gpt4 book ai didi

python - Django Postgresql JsonField查询相关字典键

转载 作者:行者123 更新时间:2023-11-28 22:22:38 29 4
gpt4 key购买 nike

我拥有的使用 Django Model 字段的模型的一部分如下所示:

class SalesModel(models.Model):
some_data = models.PositiveIntegerField(db_index=True)
some_other_data = models.CharField(max_length=50)
json_data = JSONField(blank=True, null=True)

JsonData字段的格式如下:

[{"id": val, "contribution": "some_val", }, {"id": some_val, "contribution": "some_other_val",}, {"id": other_val, "contribution": "some_another_val"}]

即格式为:

 [{'id':XX, 'contribution':XX},{'id':YY, 'contribution':YY},{'id':ZZ, 'contribution':ZZ}]

目前我可以使用 ID 的 val 过滤 Django 表。我现在想知道那个特定 ID 的贡献。

例如,如果 val = 1,我想过滤具有 ID = 1 的 JsonField 的模型 SalesModel,并且我想显示相关贡献。所以,这意味着,在 3 个可能的字典中(根据字段构造),我只会显示一个字典(由该字典的“ID”键过滤)。这意味着,如果第二个词典具有匹配的 ID,则仅显示第二个贡献,如果第一个 ID 匹配,则仅显示第一个贡献,第三个词典也类似。

有什么办法可以做到吗?

最佳答案

您可以以不同的方式重组您的 JSONField,方法是给它一个字典,其中键值对是 id: contribution 直接。通过这种方式,您可以使用 has_key 过滤器,并且 KeyTransform 将起作用,因为我不确定它是否适用于字典数组。所以假设你的 json_data 看起来像这样:

{1: 'xx', 3: 'yy', 9: 'zz'}

你可以这样查询,基于@vanojx1贡献:

SalesModel.filter(json_data__has_key=id)\
.annotate(contrib=KeyTransform(id, 'json_data')\
.values('contrib')

或者,在 postgresql 中使用原始 jsonb:

SalesModel.filter(json_data__has_key=id)\
.extra(select={'contrib': "json_data->{0}".format(id)})\
.values('contrib')

关于python - Django Postgresql JsonField查询相关字典键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47590857/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com