Django: Как перечислить или зациклить несколько классов .as_view() с очень похожими методами. (Как упростить несколько классов, которые очень похожи)
У меня есть следующие классы в файле views.py
class Base():
def function:
***blah blah blah***
return data # a list of data [data1, data2, data3, ...]
class JSONView1(Base,JSONClass)
def get_data(self):
json_data1 = list(Base().function()[0])
return json_data1
class JSONView2(Base,JSONBase):
def get_data(self):
json_data2 = list(Base().function()[1])
return json_data2
JSONView1 = JSONView1.as_view()
JSONView2 = JSONView2.as_view()
В основном, в классе Base я строю список данных, затем я создаю 2 класса, каждый из которых вызывает определенные данные из класса Base, например, JSONView1 вызывает data1 и JSONView2 вызывает data2. Эти классы JSON важны, поскольку они преобразуют данные в JSON-скрипт с помощью JSONBase (для простоты здесь не показан). Наконец, я использую .as_view() в views.py, потому что я буду вызывать их в urls.py.
Проблема в том, что это нормально для 2 Views, но что если у меня будет +5. Я не хочу создавать класс для каждых новых данных в списке, потому что единственное различие между классами - это индекс, 0,1,2,3,.... остальное одинаково
Я хотел бы иметь что-то вроде
for k in range(5):
class JSONView[k](Base,JSONClass)
def get_data(self):
json_data[k] = list(Base().function()[k])
return json_data[k]
JSONView[k] = JSONView[k].as_view()
Итерация над самим кодом с изменением индекса. Я не эксперт, поэтому пример решения этой проблемы был бы очень признателен.
Приветствует
Вы можете передать аргумент k в метод __init__, а затем использовать его в методе get_data.
Это будет выглядеть примерно так:
class JSONView(...):
def __init__(self, k, *args, **kwargs):
self.k = k
super(JSONView, self).__init__(*args, kwargs)
def get_data(self):
json_data = list(Base().function()[self.k])
return json_data
Вы можете создавать классы с суперклассами и давать атрибут (ключ, атрибут и значение, функцию или буквальное значение.
Смотрите этот пример здесь:
https://python-course.eu/oop/dynamically-creating-classes-with-type.php
Поскольку это то, что вы просите сделать, извините, у меня нет времени применить это к вашему коду, если вам нужно больше ясности, чем дает ссылка, отправьте сообщение, и я обновлю этот ответ, чтобы привести примеры кода, как вы предоставили