Prashant
Prashant

Reputation: 402

How to create and save object in bulk for dictionary in Django

I want to create object in bulk for my models. My models is

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)

and my dictionary values are -

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

Currently I am doing like as follow-

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

So how can i create object in bulk. Any help would be appreciated.

Upvotes: 2

Views: 3118

Answers (1)

user2390182
user2390182

Reputation: 73498

You can try something along the following lines which will only create 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

Upvotes: 3

Related Questions