我正在制作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)
然后对结果进行迭代,然后做下一步需要做的事情。不管怎样,即使这能起作用,在大量记录中,这也将是性能的瓶颈。