如何在Django中为字典批量创建和保存对象

时间:2018-01-26 19:32:09

标签: python django dictionary

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

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

那么如何批量创建对象呢? 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

您可以尝试以下几行,只创建2 db命中:

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