Первый : я бы посоветовал вам провести рефакторинг вашей Question
модели, поскольку она имеет ques_id
, и я думаю, что она считается дубликатом (поскольку Django уже создает поле id по умолчанию)
Затем Вам нужно изменить имя ManyToManyField
на tags
и makemigrations
, затем migrate
class Question(models.Model):
name = models.CharField(max_length=255)
tags = models.ManyToManyField(Tag)
class Meta:
ordering = ['id']
def __str__(self):
return self.name
# run make migrations
python manage.py makemigrations <<<YOUR QUESTIONS APP NAME>>>
# It will prompt you to check if you change the many to many relationship say yes
Did you rename question.Tag_name to question.tags (a ManyToManyField)? [y/N] y
# Then Run migrate
python manage.py migrate
Второй : обновите QuestionSerializers
, чтобы поле тегов сериализовало отношение
class QuestionSerializers(serializers.ModelSerializer):
tags = TagSerializers(many=True)
class Meta:
model = Question
fields = '__all__'
Таким образом, вы сделаете свой код чище. И вы хороши для go.
Ответ обновлен (фильтрация и разбиение на страницы)
Теперь, если вы хотите отфильтровать вопросы на основе предоставленных идентификаторов тегов.
Вам нужно использовать PageNumberPagination
для просмотра и фильтрации DjangoFilterBackend
.
Я рекомендую вам сделать их настройками по умолчанию для DRF.
Убедитесь, что вы установите django-filter
.
# In your settings.py
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend',
),
'PAGE_SIZE': 10
}
Теперь создайте свой собственный фильтр
# Inside filters.py
import re
import django_filters
from questions.models import Question
class QuestionsFilterSet(django_filters.FilterSet):
tags = django_filters.CharFilter(field_name='tags__id', method='tags_ids_in')
def tags_ids_in(self, qs, name, value):
ids_list = list(map(lambda id: int(id), filter(lambda x: x.isdigit(), re.split(r'\s*,\s*', value))))
return qs.filter(**{f"{name}__in": ids_list}).distinct()
class Meta:
model = Question
fields = ('tags',)
Теперь используйте ListAPIView
, чтобы составить список своих вопросов
class QuestionsListAPIView(ListAPIView):
queryset = Question.objects.all()
serializer_class = QuestionSerializers
filter_class = QuestionsFilterSet
Теперь, если вы нажмете
http://<PATH_TO_VIEW>?tags=1,2,3
, вы получите все Вопросы с тегом id 1, 2 или 3. Все они будут разбиты на 10 страниц за раз.