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

Поскольку это то, что вы просите сделать, извините, у меня нет времени применить это к вашему коду, если вам нужно больше ясности, чем дает ссылка, отправьте сообщение, и я обновлю этот ответ, чтобы привести примеры кода, как вы предоставили

Вернуться на верх