Reputation: 402
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
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