﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
29367	bulk_create with manual primary_key don't update instances state	Oscar Esgalha	Oscar Esgalha	"Given a model with manually defined primary keys:
{{{
#!python
class State(models.Model):
    two_letter_code = models.CharField(max_length=2, primary_key=True)
}}}

Performing a bulk_create with model instances will not correctly update their state.
Looping through the instances and calling save() individually will result in instances with different state from instances persisted with bulk_create:
{{{
#!python
state_ca = State(two_letter_code='CA')
State.objects.bulk_create([state_ca])
state_ca._state.adding  # => True
state_ca._state.db  # => None

state_ny = State(two_letter_code='NY')
state_ny.save()
state_ny._state.adding  # => False
state_ny._state.db  # => 'default'
}}}

One implication of this behavior is that the instances saved with bulk_create can't be used to build relationships with model instances loaded with other Queryset API methods.

Here is a demonstration:
{{{
#!python
class Group(models.Model):
    ext_id = models.CharField(primary_key=True, max_length=32)


class Analyst(models.Model):
    ext_id = models.CharField(primary_key=True, max_length=32)
    groups = models.ManyToManyField(Group)


group_aaa = Group.objects.get(ext_id='AAA')

analyst_eee = Analyst(ext_id='EEE')
Analyst.objects.bulk_create([analyst_eee])

analyst_eee.groups.set([group_aaa])  # ValueError: Cannot add ""<Group: AAA>"": instance is on database ""None"", value is on database ""default""
}}}

It fails when the `._state.db` is compared.

A current workaround option is to manually set the `._state.db` after the bulk_create:
{{{
 analyst_eee = Analyst(ext_id='EEE')
Analyst.objects.bulk_create([analyst_eee])
analyst_eee._state.db = 'default'

analyst_eee.groups.set([group_aaa]) # And now it works
}}}"	Bug	closed	Database layer (models, ORM)	dev	Normal	fixed	bulk_create, primary_key		Accepted	1	0	0	0	0	0
