簡體   English   中英

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}]

目前,我可以使用val值過濾Django表。 我現在想知道該特定ID的貢獻。

例如,如果val = 1,我想過濾具有ID = 1的JsonField的模型SalesModel ,我想顯示相關的貢獻。 因此,這意味着,在3種可能的詞典中(根據字段構造),我將僅顯示一個詞典(由該詞典的“ ID”鍵過濾)。 這意味着,如果第二個字典具有匹配的ID,則僅顯示第二個貢獻,如果第一個ID匹配,則僅顯示第一個貢獻,並且類似地,對於第三個字典。

有辦法可以做嗎?

您可以通過給它指定鍵,值對為id: contribution直接id: contribution的dict JSONField不同地重組JSONField 這樣,您就可以使用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中使用raw jsonb:

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

這應該工作DOC

SalesModel.objects.filter(json_data__id=1).values('id', 'json_data__contribution')

是的,我猜。 如果我理解正確,那么您將擁有一個要匹配的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"])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM