簡體   English   中英

Django / DRF - 獲取一個相關字段 model

[英]Django / DRF - Get field of a related model

每個人。 我想要的是通過序列化程序獲取相關 model 的字段。 我有 2 個模型:

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    def __str__(self):
        return self.question_text    



class Test(models.Model):
    test_name = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    question = models.ManyToManyField(Question, related_name='tests')
    def __str__(self):
        return self.test_name

為什么我使用 ManyToManyField? 因為我在這里關注: https://medium.com/django-rest/lets-build-a-basic-product-review-backend-with-drf-part-1-652dd9b95485

現在我可以這樣做: 在此處輸入圖像描述

但我想得到 question_text 作為回應。 我嘗試了什么:

class TestSerializer(serializers.HyperlinkedModelSerializer):
    question_text = serializers.CharField(read_only=True, source="question.question_text")
    class Meta:
        model = Test
        fields = ['pk', 'test_name', 'pub_date', 'question_text']
        expandable_fields = {
 'question': (QuestionSerializer, {'many': True})
}

但它返回:

在此處輸入圖像描述

我知道,這個問題可能出在數據庫關系中,但我無法理解。 提前致謝!

有兩種方法可以做到這一點,我不知道哪一種更好,但這就是它們 1-為問題創建一個單獨的序列化程序,並在 models.py 中向他分配 related_name

class QuestionSerializer(serializers.HyperlinkedModelSerializer):
    
    class Meta:
        model = Test
        fields = "__all__"




class TestSerializer(serializers.HyperlinkedModelSerializer):
    tests = QuestionSerializer(many=True) ## related_name
    class Meta:
        model = Test
        fields = ['pk', 'test_name', 'pub_date', 'tests']


  

2 - 使用 serializers.SerializerMethodField()

class TestSerializer(serializers.HyperlinkedModelSerializer):
        question = serializers.SerializerMethodField() 
        class Meta:
            model = Test
            fields = ['pk', 'test_name', 'pub_date', 'question']
        def get_question(self, obj):
            question = obj.tests.all()
            serilaizer = QuestionSerializer(question, many=True)
            return serilaizer.data

使用嵌套序列化器:

class QuestionSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = Question
        fields = ['question_text']

class TestSerializer(serializers.ModelSerializer):
    question = QuestionSerializer(many=True)
    class Meta:
        model = Test
        fields = ['pk', 'test_name', 'pub_date', 'question']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM