Создайте пользовательский фильтр для итерации каждого поля и проверки условия возврата - PullRequest
0 голосов
/ 16 марта 2020

Я делаю 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)

1 Ответ

1 голос
/ 16 марта 2020

Поскольку даты, скорее всего, хранятся в виде строк в ключе 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)

А затем переберите результаты и сделайте то, что вам нужно дальше. В любом случае, даже если это сработает, на большом количестве записей это будет узким местом для производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...