Django Rest Framework и @staticmethod.В чем выгода? - PullRequest
0 голосов
/ 24 сентября 2018

Я кодировал некоторые методы в serializers.py usign PyCharm.Затем я должен был написать метод для получения имени.

 def get_artist_name(obj):
    return obj.artist.name

Затем PyCharm предложил мне сделать метод статичным.

 @staticmethod
 def get_artist_name(obj):
    return obj.artist.name

С тех пор я задаюсь вопросом, в чем выгода?Это хорошая практика или что-то в этом роде?Если есть какая-либо документация, я могу прочитать об этой конкретной теме, заранее спасибо.

1 Ответ

0 голосов
/ 24 сентября 2018

Первый вариант неверен: если вы вызываете метод 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...