#29367: bulk_create with manual primary_key don't update instances state
-------------------------------------+-------------------------------------
               Reporter:  Oscar      |          Owner:  nobody
  Esgalha                            |
                   Type:  Bug        |         Status:  new
              Component:  Database   |        Version:  master
  layer (models, ORM)                |       Keywords:  bulk_create,
               Severity:  Normal     |  primary_key
           Triage Stage:             |      Has patch:  0
  Unreviewed                         |
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  0
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 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 Analist(models.Model):
     ext_id = models.CharField(primary_key=True, max_length=32)
     groups = models.ManyToManyField(Group)


 group_aaa = Group.objects.get(ext_id='AAA')

 analist_eee = Analist(ext_id='EEE')
 Analist.objects.bulk_create([analist_eee])

 analist_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:
 {{{
  analist_eee = Analist(ext_id='EEE')
 Analist.objects.bulk_create([analist_eee])
 analist_eee._state.db = 'default'

 analist_eee.groups.set([group_aaa]) # And now it works
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/29367>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/051.93cb1b3d398db09be1cb92f96f8c0aa1%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to