Python Django Postgres ArrayField\uuu包含查找的行为不符合预期
这是my models.py: 我在django shell中这样做:Python Django Postgres ArrayField\uuu包含查找的行为不符合预期,python,django,Python,Django,这是my models.py: 我在django shell中这样做: Dog.objects.create(name='Rufus', data={ 'breed': 'labrador', 'owner': { 'name': 'Bob', 'other_pets': [{ 'name': 'Fishy', }], }, }) Dog.objects.create(name='Meg', data={'breed': 'collie'}) Dog.objects.filter(data_
Dog.objects.create(name='Rufus', data={ 'breed': 'labrador', 'owner': { 'name': 'Bob', 'other_pets': [{ 'name': 'Fishy', }], }, })
Dog.objects.create(name='Meg', data={'breed': 'collie'})
Dog.objects.filter(data__breed__contains='l')
但是,当我执行最后一个命令时,它给了我一个empy queryset返回:
<QuerySet []>
只需尝试+if:
for obj in Dog.objects:
if 'l' in obj.data['breed']:
return obj
你检查过生成的SQL吗?@IgnacioVazquez Abrams,我更新了我的问题闻起来像个bug。我认为正确的条件应该是“post_tagging_dog.”“data”->“breed”中的“l”,但我对PostgreSQL的JSON支持没有经验。检查左侧JSON是否包含右侧JSON的路径/值项。因此,JSONField的
contains
不是这里使用的正确方法。您需要以文本形式获取breed
值,并检查这些值是否包含字母l
。不确定如何使用Django的ORM来实现这一点。@Sevanteri,那么对于这个问题,正确的查询是什么呢?
SELECT "post_tagging_dog"."id", "post_tagging_dog"."name", "post_tagging_dog"."data" FROM "post_tagging_dog" WHERE "post_tagging_dog"."data" -> 'breed' @> '"l"'
for obj in Dog.objects:
if 'l' in obj.data['breed']:
return obj