Django Postgresql JsonField查询相关字典键
Django Postgresql JsonField query related dictionary keys
我的部分模型使用了 Django 模型字段,如下所示:
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 的值过滤 Django table。我现在想知道那个特定 ID 的贡献。
例如,如果 val = 1,我想过滤具有 ID = 1 的 JsonField 的模型 SalesModel,并且我想显示相关的贡献。所以,这意味着,在 3 个可能的字典中(根据字段构造),我只会显示一个字典(由该字典的 'ID' 键过滤)。这意味着,如果第二个词典具有匹配的 ID,则仅显示第二个贡献,如果第一个 ID 匹配,则仅显示第一个贡献,第三个词典也类似。
有什么办法可以做到吗?
是的,我想。如果我没理解错的话,您将有一个要匹配的 ID 或一个 ID 列表。所以如果你的 ID 是 2:
my_id = 2
dict1 = [{"id":1, "contribution":10},{"id":2, "contribution":20},{"id":3, "contribution":30}]
for i in dict1:
if i["id"] == my_id:
print(i["contribution"])
这应该有效 DOC
SalesModel.objects.filter(json_data__id=1).values('id', 'json_data__contribution')
您可以以不同的方式重组您的 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')
我的部分模型使用了 Django 模型字段,如下所示:
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 的值过滤 Django table。我现在想知道那个特定 ID 的贡献。
例如,如果 val = 1,我想过滤具有 ID = 1 的 JsonField 的模型 SalesModel,并且我想显示相关的贡献。所以,这意味着,在 3 个可能的字典中(根据字段构造),我只会显示一个字典(由该字典的 'ID' 键过滤)。这意味着,如果第二个词典具有匹配的 ID,则仅显示第二个贡献,如果第一个 ID 匹配,则仅显示第一个贡献,第三个词典也类似。
有什么办法可以做到吗?
是的,我想。如果我没理解错的话,您将有一个要匹配的 ID 或一个 ID 列表。所以如果你的 ID 是 2:
my_id = 2
dict1 = [{"id":1, "contribution":10},{"id":2, "contribution":20},{"id":3, "contribution":30}]
for i in dict1:
if i["id"] == my_id:
print(i["contribution"])
这应该有效 DOC
SalesModel.objects.filter(json_data__id=1).values('id', 'json_data__contribution')
您可以以不同的方式重组您的 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')