【发布时间】:2021-01-10 17:52:40
【问题描述】:
我已经练习 Django 有一段时间了。目前我在一个项目中使用它,我通过 GET 请求获取 Facebook 数据,然后使用 Django 模型将其保存到 sqlite 数据库。我想知道如何改进以下代码并有效地保存 Facebook 帖子及其指标的列表。在我目前的情况下,我正在使用 for 循环来迭代包含多个 Facebook 帖子及其各自指标的列表,然后将其关联到特定的 Django 模型并最终保存。
def save_post(post_id, page_id):
facebook_post = Post(post_id=post_id,
access_token=fb_access_token)
post_db = PostsModel(page_id=page_id, post_id=post.post_id)
post_db.message = facebook_post.message
post_db.story = facebook_post.story
post_db.full_picture = facebook_post.full_picture
post_db.reactions_count = facebook_post.reactions_count
post_db.comments_count = facebook_post.comments_count
post_db.shares_count = facebook_post.shares_count
post_db.interactions_count = facebook_post.interactions_count
post_db.created_time = facebook_post.created_time
post_db.published = facebook_post.published
post_db.attachment_title = facebook_post.attachment_title
post_db.attachment_description = facebook_post.attachment_description
post_db.attachment_target_url = facebook_post.attachment_target_url
post_db.save()
post_db 是使用 PostsModel 实例化的 Django 模型对象,而 Post 是我编写的普通 Python 类。后者只是一个 GET 请求的集合,它从 Facebook 的 Graph API 获取数据并返回 JSON 数据,由此我将相关数据与类属性相关联(message, 'shares_count`)。
我从 Django 的文档中了解了 bulk_create 函数,但我不知道如何传递上述内容。我也尝试使用multiprocessing 和Pool,但上面的函数确实执行了。现在,我只是在列表上按顺序迭代。随着列表长度的增加,需要更多的时间来保存。
def create(self, request):
page_id = request.data['page_id']
page = get_object_or_404(PagesModel, pk=page_id)
post_list = get_list_or_404(PostsModel, page_id=page_id)
for post_id in post_list:
save_post(post_id=post_id, page_id=page)
上述函数根据page_id 从数据库中获取特定页面的已保存列表。然后,for 循环迭代列表中的每个帖子,并将其 post_id 和 page 实例发送到 save_post 函数以获取其数据并保存。
如果有人能提出更有效的方法来解决这个问题,非常感谢。谢谢。
【问题讨论】:
-
我不认为
bulk_create有用。在您的情况下,它只在一个 (.save) 处访问数据库服务器。所以,应该只是循环。