#27249: IntegrityError when using ManyToManyField.add due to type confusion
     Reporter:  sjoerdjob            |      Owner:  nobody
         Type:  Uncategorized        |     Status:  new
    Component:  Database layer       |    Version:  master
  (models, ORM)                      |   Keywords:  manytomanyfield,
     Severity:  Normal               |  integrityerror
 Triage Stage:  Unreviewed           |  Has patch:  0
Easy pickings:  0                    |      UI/UX:  0
 When specifying the primary keys of objects to `related_manager.add`, one
 has to use the same type as the database returns, at the risk of getting
 an `IntegrityError`.

 Example (using Django contrib.auth).

 >>> from django.contrib.auth.models import Group, Permission
 >>> group = Group.objects.create()
 >>> permission = Permission.objects.first()
 >>> print(permission.pk)
 >>> group.permissions.add(permission.pk)
 >>> group.permissions.add(permission.pk)
 >>> group.permissions.add(str(permission.pk))
 Traceback (most recent call last):
 ... <snip> ...
 IntegrityError: UNIQUE constraint failed: auth_group_permissions.group_id,
 >>> group.permissions.add(permission.pk)
 >>> group.permissions.add(permission.pk)

 Now of course, I assume nobody would do an explicit call to `str()` there,
 but if the primary keys come from another input source (like: a URL), it
 is not unlikely to expect them to not be the same type as the database

 (seen in 1.9.6, 1.10.1 and master).

 Not sure about how to fix it, because the type of the primary key might
 not necessarily be an integer.

Ticket URL: <https://code.djangoproject.com/ticket/27249>
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 django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
For more options, visit https://groups.google.com/d/optout.

Reply via email to