Как уменьшить количество написанного кода, когда все «мета» для каждого представления одинаковы (структура)? - PullRequest
1 голос
/ 08 октября 2019

Недавно я начал реорганизовывать / переписывать свой код. Я заметил, что некоторые части моего кода во многом похожи, и мне интересно, смогу ли я уменьшить объем кода, необходимый для получения той же функциональности.

Я хотел бы создать представления на основе названий моделей, которые яиметь и давать им те же мета-атрибуты, где единственное отличие - это наименование модели.

В настоящее время у меня есть (в views.py):

from finfor import (models, serializers)

class clientOrganizationsListCreate(generics.ListCreateAPIView):
    queryset = models.clientOrganizations.objects.all()
    serializer_class = serializers.clientOrganizationsSerializer


class financialSystemsListCreate(generics.ListCreateAPIView):
    queryset = models.financialSystems.objects.all()
    serializer_class = serializers.financialSystemsSerializer

Как видите, единственное отличиемежду ними есть clientOrganizations <> financialSystems.

Я пробовал следующее:

from finfor import (models, serializers)
from django.apps import apps

for model in apps.get_app_config('finfor').models.values():
    class f'{model}ListCreate'(generics.ListCreateAPIView):
        queryset = model.objects.all()
        serializer_class = serializers[f'{model}Serializer']

и:

from finfor import (models, serializers)
from django.apps import apps

for model in apps.get_app_config('finfor').models.values():
    type(f'{model}Serializer', (generics.ListCreateAPIView, ),
        {'queryset': model.objects.all(),
         'serializer_class': serializers[f'{model}Serializer']
         }
     )

Я думаю, что янеправильно использую type ().

Есть ли способ генерировать классы путем итерации списка ['financialSystems', 'clientOrganizations'] или чего-то подобного?

1 Ответ

2 голосов
/ 08 октября 2019
from finfor import (models, serializers)
from rest_framework import generics
import re
import importlib

class baseCreate(generics.ListCreateAPIView):
    module_path = 'finfor'

    def __init__(self):
        super(baseCreate, self).__init__()
        self.class_name = type(self).__name__
        self.model_name = re.match('(.*)ListCreate', self.class_name).groups()[0]

    def get_queryset(self):
        module = importlib.import_module('%s.models'%self.module_path)
        model = getattr(module, self.model_name)
        return model.objects.all()

    def get_serializer_class(self):
        module = importlib.import_module('%s.serializers'%self.module_path)
        serializer = getattr(module, '%sSerializer'%self.model_name)
        return serializer

class financialSystemsListCreate(baseCreate):
    pass

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