在序列化程序 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
我需要编写 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