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.