在序列化程序 DRF 中创建 api 之前编写 if else 逻辑

Write if else logic before creating api in serializer DRF

我需要编写 if else 逻辑以使用 get 方法在 values.before 旁边显示文本。

models.py

class AnalysisResult(models.Model):
    user_id=models.IntegerField(primary_key=True)
    E=models.IntegerField()
    A=models.IntegerField()
    C=models.IntegerField()
    N=models.IntegerField()
    O=models.IntegerField()
    total=models.IntegerField()
    class Meta:
        db_table='analysis_result'
        
    def __str__(self):
        return self.response

使用 DRF 和序列化器我为这个 model.my 创建了 api 创建 api 当我点击 url 时看起来像这样。

[
    {
        "user_id": 1,
        "E": 25,
        "A": 14,
        "C": 14,
        "N": 38,
        "O": 8,
        "total": 99
    }
]

但现在我想根据单个 E、A、C、N、O 的值显示一些文本。我的 api 应该看起来像这样

[
    {
        "user_id": 1,
        "E": 25,
        "A": 14,
        "C": 14,
        "N": 38,
        "O": 8,
        "total": 99,
        "E_Text":"some text",
        "A_Text":"some text",
        "C_Text":"some text",
        "N_text":"some text",
        "O_text":"some text",
         
    }
]

此文本随 E、A、C、N、O 的不同值而变化

我怎样才能完成这个任务我不是understanding.Please给我一个线索。

serailizer.py

class AnalysisResultSerializer(serializers.ModelSerializer):
    
    class Meta:
        model=AnalysisResult
        fields='__all__'

views.py

@api_view(['GET'])
def AnalysisResultInfo(request,user_id):
    if request.method == 'GET':
        Results=AnalysisResult.objects.filter(pk=user_id)
        serializer=AnalysisResultSerializer(Results, many=True)
        return Response(serializer.data)

urls.py

path('Results/<int:user_id>/',views.AnalysisResultInfo)

我不想将所有这些文本存储在数据库中。我有一个想法,这可以使用 SerializerMethodField() 来完成。我就是不知道怎么办。

你可以这样使用SerializerMethodField()

class AnalysisResultSerializer(serializers.ModelSerializer):
    E_Text = serializers.SerializerMethodField()

    class Meta:
        model=AnalysisResult
        fields='__all__'
    
    def get_E_Text(self, obj):
        # derive the result from obj instance
        return result

或者您可以像这样向模型添加 属性 装饰器

class AnalysisResult(models.Model):
    user_id=models.IntegerField(primary_key=True)
    E=models.IntegerField()
    A=models.IntegerField()
    C=models.IntegerField()
    N=models.IntegerField()
    O=models.IntegerField()
    total=models.IntegerField()
    class Meta:
        db_table='analysis_result'
        
    def __str__(self):
        return self.response

    @property
    def E_Text(self):
        # derive the value here
        return result

在序列化器中

class AnalysisResultSerializer(serializers.ModelSerializer):
    E_Text = serializers.ReadOnlyField()

    class Meta:
        model=AnalysisResult
        fields='__all__'

这里的区别是 @propery 字段将在代码中的任何位置随实例可用,而 SerializerMethodField 仅在序列化程序中可用。

因此请根据您的用例使用任何方法。

使用 SerializerMethodField

class AnalysisResultSerializer(serializers.ModelSerializer):
    E_Text = serializers.SerializerMethodField()
    A_Text = serializers.SerializerMethodField()
    C_Text = serializers.SerializerMethodField()
    N_Text = serializers.SerializerMethodField()
    O_Text = serializers.SerializerMethodField()
    
    class Meta:
        model=AnalysisResult
        fields='__all__'
    
    def get_E_Text(self, obj):
        # get your in obj and do the math
        return "String you wanted"

    # Do same for all other fields