Python3 - конструктор класса переопределения DRF - PullRequest
0 голосов
/ 13 декабря 2018

Я знаю, что это довольно легко сделать, но в этот момент я немного запутался.

У меня есть класс:

class CustomListView(view.CustomView, generic.ListApiView):

    queryset = models.Custom.objects.all()
    serializer_class = serializers.CustomListSerializer

    def perform_instance(self):
       url = self.request.path_info
       ... some stuff
       custom_obj = {...}
       return custom_obj

    def get_queryset(self):
        obj = self.perform_instance()
        ...

    def get_serializer_class(self):
        obj = self.custom_obj()

Мне нужно создать свой класс таким образом, чтобы custom_obj стал атрибутом класса , (так что execute_instance будет вызываться только одинвремя создания класса) и custom_obj становится доступным экземпляром self.obj внутри get_queryset и get_serializer_class.

Я пытался вызвать super()__init__ и инстанцировал perform_instance другим способом, но я не могу 'Я не могу найти решение.

Я пробовал что-то вроде этого:

class CustomListView(view.CustomView, generic.ListApiView):

    queryset = models.Custom.objects.all()
    serializer_class = serializers.CustomListSerializer

    def __init__(self, *args, **kwargs):
        obj_instances = self.perform_instance()
        """ or self["obj_instances"] = self.perform_instance() 
        assigning obj_instance as class variable and more"""

        super(CustomListView, self).__init__(*args, **kwargs)

    def perform_instance(self):
        ...

    def get_queryset(self):
        obj = self.obj_instance
        ...

1 Ответ

0 голосов
/ 14 декабря 2018

Во-первых, вы должны знать, что представление создается в каждом запросе.Так что custom_obj придется вычислять для каждого запроса, если вы не используете механизм кэширования , который, я думаю, выходит за рамки вашего вопроса. Во-вторых, вы пытаетесь получить экземпляр атрибут, а не атрибут класса.Проверьте разница .

рассмотрев все это, вы можете использовать python @property decorator для достижения того, что вы хотите следующим образом:

@property
def custom_obj(self):
   # property caching mecahnism
   if not hasattr(self, '_custom_obj'):
       ... some caluculation...
       self._custom_object = {...}
   return self._custom_obj

Теперь вы можете просто позвонить self.custom_obj

...