【问题标题】:Django Save Multiple Objects At OnceDjango一次保存多个对象
【发布时间】: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 函数,但我不知道如何传递上述内容。我也尝试使用multiprocessingPool,但上面的函数确实执行了。现在,我只是在列表上按顺序迭代。随着列表长度的增加,需要更多的时间来保存。


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_idpage 实例发送到 save_post 函数以获取其数据并保存。

如果有人能提出更有效的方法来解决这个问题,非常感谢。谢谢。

【问题讨论】:

  • 我不认为bulk_create 有用。在您的情况下,它只在一个 (.save) 处访问数据库服务器。所以,应该只是循环。

标签: python django


【解决方案1】:

bulk_load 正朝着正确的方向前进。生成 PostsModel 对象的列表,然后使用 bulk_create 将它们上传到数据库中。这里的一个重要注意事项是,如果帖子已经存在于数据库中,它将不起作用。要更新帖子,请尝试 bulk_update。

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
    return post_db

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)
    
    post_model_list = [save_post(post_id=post_id, page_id=page) for post_id in 
                       post_list]
    
    PostsModel.objects.bulk_create(post_model_list]
        

【讨论】:

  • 非常感谢您的帮助。现在效率更高了。
猜你喜欢
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多