动态将字段添加到drf序列化器

时间:2018-10-17 12:53:46

标签: django-models django-rest-framework django-serializer

我有一个API端点,该端点返回我的一个模型的对象列表。 我有一个非常简单的序列化程序,当前返回所有模型字段。

我现在需要在此序列化器中添加另一个字段,该字段是通过在模型字段和另一个也是动态计算的数据结构上应用逻辑来计算的,但是每次调用API时只应计算一次

对于每个API调用,而不是针对序列化器返回的每个对象,向串行器提供此结构的方式是什么?

我的ModelViewSet(没有多余的字段)非常简单:

class MyModelViewset(ModelViewSet):
    queryset = SomeModel.objects.all()
    serializer_class = SomeModelSerializer

1 个答案:

答案 0 :(得分:0)

关于如何实现此目标的一些建议:

  • 要只计算一次并在序列化器中使用它,应将其添加到序列化器context中。
  • 您可以在In [3]: def factorial(n): ...: if n == 0: ...: return 1 ...: return n * factorial(n-1) ...: factorial(3) ...: Out[3]: 6 类中创建@property,并且可以通过序列化器字段将其公开为只读。 Django也有@cached_property,因此该值只计算一次,并且只要实例执行就可以持续存在
  • 如果要计算某些内容,可以使用SerializerMethodField字段(您可以在其中访问序列化程序上下文)。

这是一个简单的示例。

SomeModel