使自定义筛选器迭代每个字段并检查要返回的条件



我正在制作Custom Filter

它应该检查模型的每个JSONField,并根据条件拾取行。

这些是我想要的代码。

我该如何解决这个问题??

class MyText(models.Model):
myJson = JSONField()
class MyTextFilter(filters.FilterSet):
post_date = filters.DateTimeFilter(method="post_date_filter")
def post_date_filter(self, queryset, name, value): 
for mt in MyText:
jsonObj = json.loads(mt.myJson)
if jsonObj['postdate'] > value:
#do something here????
#return something here?????
class Meta:
model = MyText

我试过这两个。感谢@Charnel

ls = MyText.objects.annotate(postdate=Cast(F('myJson__postdate'), DateField())).values_list('postdate', flat=True)
print(ls)
ls = MyText.objects.annotate(postdate=Cast(F('data__postdate'), DateField())).values_list('postdate', flat=True)
print(ls)

前一个显示

<QuerySet [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, '...(remaining elements truncated)...']>

后面的显示

Cannot resolve keyword 'data' into field. Choices are: id,myJson 

我检查了我的Json,有一个条目是这样的

{"postdate": "Wed Mar 18 16:44:34 +0000 2020", "id": 1240318188610437122}

我尝试了下面的一些测试,它正确地显示了json,,,所以我需要从json中提取项目的方法。。。。

ls = Mytext.objects.annotate(postdate=Cast('myJson', JSONField())).values_list('postdate', flat=True)
print(ls)

由于日期很可能以字符串形式存储在postdate密钥中,因此这可能是一个解决方案(未经测试(:

from django.db.models import DateField
from django.db.models.functions import Cast
MyText.objects.annotate(postdate=Cast(F('data__postdate'), DateField()).filter(postdate__gt=value)

然后对结果进行迭代,然后做下一步需要做的事情。不管怎样,即使这能起作用,在大量记录中,这也将是性能的瓶颈。

最新更新