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



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

型号.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__'

视图.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()
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

您可以像这个一样使用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仅可用于序列化程序。

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

相关内容

  • 没有找到相关文章

最新更新