【问题标题】:Django bulk_create update on duplicate fieldsDjango bulk_create 更新重复字段
【发布时间】:2014-10-11 13:13:46
【问题描述】:

我有一个镜像外部数据源的模型,有时外部数据会更改为旧记录。我想从外部数据中批量创建对象以提高速度,但我找不到任何有关更新重复字段的文档。

示例模型:

class Author(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)

class Book(models.Model):

    author = models.ForeignKey('Author')
    title = models.CharField(max_length=255)
    price = models.FloatField()  # Sometimes changes

    class Meta:
        unique_together = ('author', 'title')

在创建循环中运行它非常慢(几千条记录需要几分钟),因为每本书都需要两个事务:一个用于 get_or_create author,另一个用于 get_or_create the Book。当书籍与作者和标题匹配时,是否可以使用 bulk_create 之类的东西并更新价格?

【问题讨论】:

    标签: django postgresql


    【解决方案1】:

    在下文中,我假设您的外部数据源与以下内容“形态等价”:

    books = [{'title': 'Title1', 'author': 'author name 1', 'price': 23.50},
             {'title': 'Title2', 'author': 'author name 2', 'price': 24.50}, ...]
    

    那么你可以用这种方式更新你的模型

    books_queryset = Book.objects.select_related()
    
    for book in books:
       try:
         item = books_queryset.get(title=book['title'], author__last_name=book['author'])
         item.price = book['price']
         item.save()
       except ObjectDoesNotExist:
         # Add new item
    

    【讨论】:

    • 我想“添加新项目”部分可以扩展为新对象的 bulk_create。我担心这会对大量书籍样本产生什么影响,但这似乎是一个开始。
    猜你喜欢
    • 2017-08-20
    • 2016-07-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多