【问题标题】:Searching for list of values in a Django JSONField在 Django JSONField 中搜索值列表
【发布时间】:2018-10-30 08:20:29
【问题描述】:

所以我有这个model 和这个JSONField -

class Details(models.Model):
    ref_det = JSONField(null=True, default=dict())

ref_det 以这种格式存储值

{'user_id': '2231', 'org_id': 'qpdkm12'}

模型的每个对象都有其 ref_det 作为仅包含这两个值的字典。

现在我有这个用户 ID 列表 - user_ids - 我想从模型中获取这些对象,其中ref_det 字段中的 user_id 键包含 user_ids 中的任何 user_id列表。

因此,如果我有user_ids = ['2231', '973','431'],我应该得到那些Details 对象,其ref_detuser_id 作为列表中的3 个值中的任何一个。

我尝试通过contains 进行查找,但我认为它只支持查找单个值而不是列表。

我认为__values__contains (https://docs.djangoproject.com/en/1.9/ref/contrib/postgres/fields/#hstorefield) 适合这个用例,但话说回来,我没有HStoreField

有谁知道我该如何度过这个难关?

谢谢!

【问题讨论】:

  • 这里是 jsonfield 的正确选择吗?由于“模型的每个对象都将其 ref_det 作为仅包含这两个值的字典”,因此适当的关系模型使用起来会更简单,并且可能性能更好。
  • @brunodesthuilliers - 我同意,但 JSONField 早在几个月前就已经在许多地方使用了。所以我认为最好解决它,而不是创建一个新模型。
  • 我不是在谈论“创建一个新模型”,而是关于修改现有模型,这可以使用迁移轻松完成。这当然需要更改客户端代码(使用此模型的代码),但如果知道您将始终拥有这两个键并且在 jsonfield 中只有这两个键,那么修复错误的设计比“解决”它更好,甚至如果它现在需要更多的工作(提示:它肯定会在未来节省时间)。只是我的 2 美分...
  • 你是对的。这当然更好。

标签: django django-1.9 django-jsonfield


【解决方案1】:

Django 1.10 或更高版本:

你可以这样试试:

 Details.objects.filter(ref_det__user_id__in=['2231', '973','431'])

Django 1.9:

你可以这样试试:

 list(filter(lambda x: x.ref_det.get('user_id') in ['2231', '973','431'], Details.objects.all()))  # it will return a list not queryset

仅供参考:我尝试使用 Django 1.10.8 进行此操作,但我认为,您可以在 JSONField(reference) 中执行 containsinisnull 等查找操作。

【讨论】:

  • 你说得对,这个解决方案不适用于 Django 1.9。让我看看是否有其他方法可以做到这一点
  • 那么,如果ref_det 是一个字典列表,并且您想在查询集中的列表中的任何字典中搜索用户 ID,该怎么办?这可能吗?
猜你喜欢
  • 2020-12-12
  • 2019-09-26
  • 2019-07-16
  • 2013-07-06
  • 1970-01-01
  • 2017-07-03
  • 2017-06-28
  • 2019-10-08
  • 1970-01-01
相关资源
最近更新 更多