在使用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
仅可用于序列化程序。
因此,根据您的用例使用任何方法。