3 回答

TA貢獻1806條經(jīng)驗 獲得超8個贊
你只需要tags在你的QuestionSerializers
class QuestionSerializers(serializers.ModelSerializer):
tags = TagSerializers(source='Tag_name', many=True)
class Meta:
model = Question
fields = ('id', 'name', 'tags')
它會給你這樣的回應
{
"id": 1,
"name": "QUES 1",
"tags": [{
"id": 1,
"name": "Abcd"
}]
}
您基于標簽獲取的查詢將是這樣的
Question.objects.filter(Tag_name__in=[1, 2, 4])

TA貢獻1784條經(jīng)驗 獲得超9個贊
您需要將tags字段作為另一個序列化程序數(shù)據(jù)添加到您的QuestionSerializer.
您的QuestionSerializer代碼應如下所示:
class QuestionSerializers(serializers.ModelSerializer):
Tag_name = TagSerializer(many=True)
class Meta:
model = Question
fields = '__all__'
如果您想要確切tags的名稱作為響應,您可以SerializerMethodField這樣指定:
class QuestionSerializer(serializers.ModelSerializer):
tags = serializers.SerializerMethodField()
get_tags(self, instance):
return TagSerializer(instance.Tag_name, many=True).data
class Meta:
model = Question
fields = ('ques_id', 'name', 'tags')

TA貢獻1811條經(jīng)驗 獲得超6個贊
首先:我建議你重構你的Question模型,因為它有一個ques_id,我認為它被認為是重復的(因為 Django 已經(jīng)默認創(chuàng)建了一個 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__'
這樣你就可以讓你的代碼更干凈。你很高興。
答案更新(過濾和分頁)
現(xiàn)在,如果您想根據(jù)提供的標簽 ID 過濾問題。
您需要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
}
現(xiàn)在創(chuàng)建您的自定義過濾器
# 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',)
現(xiàn)在ListAPIView用來列出你的問題
class QuestionsListAPIView(ListAPIView):
queryset = Question.objects.all()
serializer_class = QuestionSerializers
filter_class = QuestionsFilterSet
現(xiàn)在如果你打
http://<PATH_TO_VIEW>?tags=1,2,3
您將收到標簽 ID 為 1、2 或 3 的所有問題。所有這些問題將一次分頁 10 個結果。
添加回答
舉報