Первый вариант неверен: если вы вызываете метод instance , первым параметром будет callee (x
in x.method(para, meter)
).Таким образом, это означало бы, что вам нужно написать это следующим образом:
def get_artist_name(<b>self,</b> obj):
return obj.artist.name
Чтобы все работало правильно, как показано в документации SerializerMethodField
.
Поскольку вы не используете self
в своем теле функции, нет смысла писать функцию с параметром self
.Более того, не делая ее @staticmethod
, функцию можно правильно вызывать только с экземпляром сериализатора: если вы вызываете ее с 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
.