在django queryset过滤器中,如何检查json字段中至少有一个键是否为非空值?

时间:2018-05-20 06:06:56

标签: python django django-queryset django-jsonfield

class Library(models.model):
    book = JSONField(default=[], blank=True, null=True)

'book'的可能结构是{'title':'','no_of_pages':'','author_name':'','color':'',edition:''}

我正在尝试编写一个django查询,该查询仅返回书中至少有一个非空值的记录(即 title no_of_pages author_name color edition 有一些价值)

一个可能的解决方案是:

Author.objects.filter(
    ~Q(book__title='') |
    ~Q(book__no_of_pages='') | 
    ~Q(book__author_name='') |
    ~Q(book__color='') |
    ~Q(book__edition='')
)

有没有更好的方法呢?可能会出现以后书籍可能会有一些额外的密钥,例如发布者可用性

如何在不必提及字段的特定键的情况下执行此过滤器(只检查至少一个具有某些值的键)?或者用所有提到的密钥编写此查询的更短方法?

2 个答案:

答案 0 :(得分:0)

Author.objects.filter(book__has_any_keys=['title', 'no_of_pages', 'author_name', 'color'])

按照documentation中的规定尝试此操作,如果这适用于您。

答案 1 :(得分:0)

这本书不是空字典的作者列表。

Author.objects.filter(~Q(book__exact={}))