3 回答

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

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊
您需要將tags字段作為另一個(gè)序列化程序數(shù)據(jù)添加到您的QuestionSerializer.
您的QuestionSerializer代碼應(yīng)如下所示:
class QuestionSerializers(serializers.ModelSerializer):
Tag_name = TagSerializer(many=True)
class Meta:
model = Question
fields = '__all__'
如果您想要確切tags的名稱作為響應(yīng),您可以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貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊
首先:我建議你重構(gòu)你的Question模型,因?yàn)樗幸粋€(gè)ques_id,我認(rèn)為它被認(rèn)為是重復(fù)的(因?yàn)?Django 已經(jīng)默認(rèn)創(chuàng)建了一個(gè) 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以使標(biāo)簽字段序列化關(guān)系
class QuestionSerializers(serializers.ModelSerializer):
tags = TagSerializers(many=True)
class Meta:
model = Question
fields = '__all__'
這樣你就可以讓你的代碼更干凈。你很高興。
答案更新(過濾和分頁)
現(xiàn)在,如果您想根據(jù)提供的標(biāo)簽 ID 過濾問題。
您需要PageNumberPagination用于您的視圖,并用于過濾使用DjangoFilterBackend.
我建議您將它們?cè)O(shè)為 DRF 設(shè)置的默認(rèn)值。
確保您已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
您將收到標(biāo)簽 ID 為 1、2 或 3 的所有問題。所有這些問題將一次分頁 10 個(gè)結(jié)果。
添加回答
舉報(bào)