第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

根據(jù)相關ManyToMany另一個Model id的id過濾查詢模型的結果

根據(jù)相關ManyToMany另一個Model id的id過濾查詢模型的結果

達令說 2022-07-12 14:45:00
我有 2 個模型class Tag(models.Model):    id = models.AutoField(primary_key=True)    name = models.CharField(max_length=255)    def __str__(self):        return self.nameclass Question(models.Model):    ques_id = models.IntegerField(default=0)    name = models.CharField(max_length=255)    Tag_name = models.ManyToManyField(Tag)    class Meta:        ordering = ['ques_id']    def __str__(self):        return self.namesearlizers.pyclass TagSerializers(serializers.ModelSerializer):    class Meta:        model = Tag        fields = '__all__'class QuestionSerializers(serializers.ModelSerializer):    class Meta:        model = Question        fields = '__all__'這是我的searilzers課。我想要這樣的回應{  "id": 1,  "name": "QUES 1",  "tags": [{     "id": 1,     "name": "Abcd"   }]} 給定一些輸入標簽 ID,例如 Tag_id = 1 或 2 或 3,將查詢什么來獲取 10 個問題。
查看完整描述

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])


查看完整回答
反對 回復 2022-07-12
?
千萬里不及你

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')


查看完整回答
反對 回復 2022-07-12
?
楊魅力

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 個結果。


查看完整回答
反對 回復 2022-07-12
  • 3 回答
  • 0 關注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號