Django Rest 框架和@staticmethod。它有什么好处?

Ron*_*ipe 2 python django static-methods django-rest-framework

我在 serializers.py 中使用了 PyCharm 编写了一些方法。然后我必须编写一个方法来获取名称。

 def get_artist_name(obj):
    return obj.artist.name
Run Code Online (Sandbox Code Playgroud)

然后 PyCharm 建议我将方法设为静态。

 @staticmethod
 def get_artist_name(obj):
    return obj.artist.name
Run Code Online (Sandbox Code Playgroud)

从那以后我想知道它有什么好处?这是一个很好的做法或类似的东西?如果有我可以阅读有关此特定主题的任何文档,请提前致谢。

Wil*_*sem 7

第一个变体是错误的:如果你调用一个实例方法,第一个参数是被调用者xin x.method(para, meter))。所以这意味着你需要这样写:

def get_artist_name(self, obj):
    return obj.artist.name
Run Code Online (Sandbox Code Playgroud)

为了让它正常工作,足以证明中的文档SerializerMethodField

然而,因为你不使用self在你的函数体,没有用写同一个函数self的参数。此外,通过不将其@staticmethod设为a ,该函数只能使用序列化程序实例正确调用:如果您将使用 调用它SerializerClass.get_artist_name(None, obj),则需要提供未使用的第一个参数。这与使用 调用它形成对比some_serializer.get_artist_name(obj),后者只有一个显式参数。

通过使用@staticmethod,您可以“协调”两者:现在您可以调用SerializerClass.get_artist_name(obj)、 和some_serializer.get_artist_name(obj)@staticmethod装饰器,将确保两者以相同的方式工作。

除非您认为您需要访问序列化器对象,或者子类需要它(通常您希望避免从子实现中“删除”装饰器),否则使用@staticmethod.