Как отфильтровать Django Model по месяцу или году из JSON-дикта?

Я пытаюсь разобрать базу данных JSON и отфильтровать по месяцу или году с помощью Django, и это ставит меня в тупик, поскольку это должно быть просто.

Пример пары ключ-значение dict в объекте JSON имеет следующий формат:

"release_date": "2022-12-25T07:00:00",

Из моего файла views.py я настроил эту функцию для фильтрации модели:

@api_view(['GET'])
def yearList(request,pk):
    queryset = Character.objects.filter(release_date__year=pk)
    serializer = CharacterSerializer(queryset, many=True)
    return Response(serializer.data)

А в моем urls.py у меня есть этот urlpattern (игнорируя все остальные шаблоны)

urlpatterns = [
    path('year/<str:pk>', views.CharacterList.as_view(), name="Character by year" )
]

Character model from models.py as requested:

class Character(models.Model):
    name = models.CharField(max_length=60)
    title = models.CharField(max_length=100)
    game_origin = models.CharField(null=True, blank=True, max_length=100)
    ref_id = models.CharField(null=True, max_length=20)
    ref_link = models.CharField(null=True, max_length=100)
    icon_link = models.CharField(null=True, max_length=100)
    sprite= models.CharField(null=True, max_length=100)
    portrait= models.CharField(null=True, max_length=100)
    attack= models.CharField(null=True, max_length=100)
    special= models.CharField(null=True, max_length=100)
    damaged= models.CharField(null=True, max_length=100)
    voice_1 = models.CharField(null=True, max_length=100)
    voice_2 = models.CharField(null=True, max_length=100)
    line_1 = models.TextField(null=True)
    line_2 = models.TextField(null=True)
    summary = models.TextField(null=True)
    realm = models.CharField(max_length=60)
    release_date = models.DateTimeField(auto_now=False)
    index = models.IntegerField()

    def __str__(self):
        return self.name + " " + self.title

Я перешел по этой ссылке, чтобы понять идею добавления "__year" к атрибуту release_date при фильтрации набора запросов. Но это не фильтрует базу данных, я по-прежнему вижу все объекты. Где я ошибаюсь? Я не могу искать возможность фильтрации по месяцам, если я не могу отфильтровать даже годы, поэтому я ориентируюсь сначала на год. Заранее спасибо.

Типичным способом добавления фильтров к представлению является прием параметров запроса в URL, таких как http://localhost:8000/character/?year=1990.

Чтобы реализовать это в вашем представлении, вы получаете параметры из request.GET:

@api_view(['GET'])
def characters(request):
    queryset = Character.objects.filter(release_date__year=request.GET['year'])
    serializer = CharacterSerializer(queryset, many=True)
    return Response(serializer.data)

Сложность этого быстро возрастает по мере того, как вы добавляете все больше полей для фильтрации. Библиотека django-filter предоставляет отличный API для настройки фильтров на все ваши модели, так что вам не придется писать все это самостоятельно.

Вернуться на верх