2

我拥有的使用 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 匹配,则仅显示第一个贡献,对于第三个字典也是如此。

有没有办法可以做到?

4

3 回答 3

3

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')
于 2017-12-01T10:51:24.313 回答
1

这应该工作文档

SalesModel.objects.filter(json_data__id=1).values('id', 'json_data__contribution')
于 2017-12-01T10:20:10.260 回答
0

是的,我猜。如果我理解正确,您将有一个要匹配的 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"])
于 2017-12-01T10:16:24.937 回答