您有 2 个选择:
要么计算模型中的结果
或在序列化中添加字段
您的选择取决于您是否想在其他地方使用该计算结果以及您是否可以触摸模型。
当你想计算模型中的结果时
遵循 Django 派生全名的示例,位于以下位置:https://github.com/django/django/blob/master/django/contrib/auth/models.py#L348
或者在文档中解释:https://docs.djangoproject.com/en/dev/topics/db/models/#model-methods
这将自动充当 DRF 的只读字段。
您可以在下面的代码中看到用法(get_full_name)。
当您想在序列化中添加字段时
您可以在 DRF 文档中找到答案:http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield
序列化方法字段这是一个只读字段...它可用于将任何类型的数据添加到对象的序列化表示中。
Serializers.py 中的 hour_since_joined 示例:
from django.contrib.auth.models import User, Group
from rest_framework import serializers
from django.utils.timezone import now
class UserSerializer(serializers.HyperlinkedModelSerializer):
hours_since_joined = serializers.SerializerMethodField()
class Meta:
model = User
fields = ('url', 'username', 'email', 'groups', 'hours_since_joined', 'first_name', 'last_name', 'get_full_name' )
def get_hours_since_joined(self, obj):
return (now() - obj.date_joined).total_seconds() // 3600
class GroupSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Group
fields = ('url', 'name', 'user_set')
对于你的情况:
class SnippetSerializer(serializers.HyperlinkedModelSerializer):
owner = serializers.ReadOnlyField(source='owner.username')
result = serializers.SerializerMethodField()
class Meta:
model = Snippet
fields = ('title', 'code', 'owner', 'url', 'result')
def get_result(self, obj):
# code here to calculate the result
# or return obj.calc_result() if you have that calculation in the model
return "some result"
显示 DRF 可浏览 API 中添加的字段
您需要在元字段中列出它们 - 请参阅上面的示例。这将在请求的可浏览输出中呈现该内容。但是,它不会在 DRF 的 HTML 表单中显示它们。原因是HTML表单仅用于提交信息,因此restframework模板在渲染时跳过了只读字段。
正如您所看到的,加入后的全名和小时数并未呈现在表单中,但可用于 API:
如果您想在表单上也显示只读字段
您需要覆盖restframework模板。
{% load rest_framework %}
{% for field in form %}
{% render_field field style=style %}
{% endfor %}
-
更改 input.html 中的输入行(添加禁用属性)
<input name="{{ field.name }}" {% if field.read_only %}disabled{% endif %} {% if style.input_type != "file" %}class="form-control"{% endif %} type="{{ style.input_type }}" {% if style.placeholder %}placeholder="{{ style.placeholder }}"{% endif %} {% if field.value %}value="{{ field.value }}"{% endif %}>
结果: