[英]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.