Django, Назначить определенную фукцию полю модели и затем вызвать ее

У меня есть модель, построенная следующим образом

class ApiPartner(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=30, verbose_name=_('Name'))
    api_key = models.CharField(max_length=50, verbose_name=_('API key'), null=True)
    secret_key = models.CharField(max_length=50, verbose_name=_('Secret key'), null=True)
    client_key = models.CharField(max_length=50, verbose_name=_('Client key'), null=True)
    endpoint = models.CharField(max_length=50, verbose_name=_('Endpoint'), null=True)
    logo = models.ImageField(upload_to='logos/', null=True)

У каждого API-партнера есть свой метод для получения данных, например

def get_youtube_posts(endpoint,api_key):
    results=list(requests.get(endpoint+'?key='+api_key).json())
    return results[0:50]

def get_instagram_posts(endpoint,api_key,secret_key):
    return requests.get(endpoint+'?key='+api_key+'&secret='+secret_key)

Вопрос в том, как мне назначить функцию 'get_posts' модели, чтобы я мог вызвать общий ApiPartner.get_posts() и он получил посты, используя заданную функцию? Я думаю о models.FunctionField, но я знаю, что такой функции не существует. Я думаю, что это больше логическая проблема, чем техническая, но я не могу найти способ. Спасибо

Возможно, я неправильно понимаю вопрос; но вы можете просто присвоить его как свойство классу модели:

class MyModel(models.Model):
   fields...
   
   @property
   def youtube_posts(self):
       results=list(requests.get(self.endpoint+'?key='+self.api_key).json())
       return results[0:50]

   @property
   def instagram_posts(self):
       return requests.get(self.endpoint+'?key='+self.api_key+'&secret='+self.secret_key)

Затем вы можете вызвать его с экземпляром вашей модели.

mymodel = MyModel.objects.all().first()
youtube_posts = mymodel.youtube_posts
# or
instagram_posts = mymodel.instagram_posts

Но это вернет только одно или другое, поскольку ваши модели основаны на одной конкретной конечной точке. Чтобы создать более общий метод на модели, используйте описанные выше методы, плюс этот:

@property
def platform_posts(self)
    if "instagram" in self.endpoint:
        return self.instagram_posts
    elif "youtube" in self.endpoint:
        return self.youtube_posts
    ... You get the gist.
Вернуться на верх