Как отфильтровать 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 для настройки фильтров на все ваши модели, так что вам не придется писать все это самостоятельно.