【问题标题】:Write if else logic before creating api in serializer DRF在序列化程序 DRF 中创建 api 之前编写 if else 逻辑
【发布时间】:2021-04-18 03:00:24
【问题描述】:

在使用 get 方法之前,我需要编写 if else 逻辑以在我的值旁边显示文本。

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 和序列化程序,我为这个模型创建了 api。当我点击 url 时,我创建的 api 看起来像这样。

[
    {
        "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 的不同值而异

我怎么能完成这个我不理解的任务。请给我一个领导。

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() 来完成。我只是不知道怎么做。

【问题讨论】:

  • 您要获取的响应不是有效的 JSON。
  • 哦,好吧!我明白了,我现在已经编辑了,但我的问题仍然是一样的。
  • @Ajaysaini 如果你能建议我一个合适的标题。

标签: django postgresql django-rest-framework logic django-serializer


【解决方案1】:

使用 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

【讨论】:

    【解决方案2】:

    你可以像这样使用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 将仅在序列化程序中可用。

    所以根据您的用例使用任何方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      相关资源
      最近更新 更多