【问题标题】:How to create and save object in bulk for dictionary in Django如何在Django中为字典批量创建和保存对象
【发布时间】:2023-03-27 22:52:01
【问题描述】:

我想为我的模型批量创建对象。 我的模型是

class Fees(models.Model):
    city = models.CharField(max_length=200, blank=True)
    contact = models.CharField(max_length=200, blank=True)
    class = models.CharField(max_length=200, blank=True)
    veg = models.BooleanField(default=False)
    rollno = models.CharField(max_length=200, blank=True)

我的字典值是 -

response = {
    'A101': {
        'VEG': True,
        'CONTACT': '12345',
        'CLASS': 'SIX',
        'ROLLNO': 'A101',
        'CITY': 'CHANDI',
    },
    'A102': {
        'VEG': True,
        'CONTACT': '54321',
        'CLASS': 'SEVEN',
        'ROLLNO': 'A102',
        'CITY': 'GANGTOK',
    },
}

目前我的做法如下-

def create_obj(response):
    for key, value in response.items():
        fee_obj, _ = Fees.objects.get_or_create(
            rollno=key, defaults={
                **change_value
            })
        yield fee_obj

那么我怎样才能批量创建对象。 任何帮助将不胜感激。

【问题讨论】:

标签: python django dictionary


【解决方案1】:

您可以尝试以下方法,这些方法只会产生 2 个 db hits:

def create_obj(response):
    # 1st db query: existing fees instances form response
    existing = Fees.objects.filter(rollno__in=response.keys())

    keys = set(f.rollno for f in existing)

    # 2nd db query: bulk create non-existing
    new = Fees.objects.bulk_create([
         Fees(**{ke.lower(): va for ke, va in value.items()})
         for key, value in response.items() if key not in keys
    ])

    yield from existing
    yield from new

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 2018-06-09
    • 2016-11-13
    • 2012-08-09
    • 2011-04-20
    • 2021-10-14
    • 2011-05-12
    • 2021-04-30
    相关资源
    最近更新 更多