Getting django.db.utils.IntegrityError: (1062, "Duplicate entry '' for key ''") while creating Model instance in Django

Hi there,

I have Workspace Model, which have a custom save() method, in which I am creating custom permissions for each instance of Workspace Model and saving the permissions in a group created for each Workspace instance. Now the issue is, when I use Django Admin interface to create Workspace instance, everything goes fine and I don’t see anything wrong, but when I create Workspace instance using python shell or in the views.py, I get the following error:

django.db.utils.IntegrityError: (1062, "Duplicate entry '7-can_remove_from_workspace_testworkspace' for key 'auth_permission.auth_permission_content_type_id_codename_01ab375a_uniq'")

I am getting the error even though I am not duplicating any Workspace instance or Group instance (I am sure because I double-checked it).

My Workspace Model is:

class Workspace(models.Model):
    name = models.CharField(max_length=254, unique=True)
    name_slug = models.SlugField(editable=False, default='')
    admins = models.ManyToManyField(User, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def save(self, *args, **kwargs):
        if self.name:
            try:
                group = Group.objects.get(name=self.name)
                group.delete()
            except Exception as ex:
                print(ex)
            
            permissions = Permission.objects.all()

            for p in permissions:
                if p.name.endswith(self.name):
                    p.delete()

        super(Workspace, self).save(*args, **kwargs)

        self.name_slug = slugify(self.name)

        workspace_group, _ = Group.objects.get_or_create(
            name="manage-workspace-" + self.name_slug
        )

        content_type = ContentType.objects.get_for_model(Workspace)

        permissions = []
        permissions.append(
            Permission.objects.get_or_create(
                codename='can_remove_from_workspace_%s' % self.name_slug,
                name='Can Remove User From Workspace %s' % self.name,
                content_type=content_type,
            )[0]
        )
        permissions.append(
            Permission.objects.get_or_create(
                codename='can_add_to_workspace_%s' % self.name_slug,
                name='Can Add User To Workspace %s' % self.name,
                content_type=content_type,
            )[0]
        )
        permissions.append(
            Permission.objects.get_or_create(
                codename='can_view_from_workspace_%s' % self.name_slug,
                name='Can View User From Workspace %s' % self.name,
                content_type=content_type,
            )[0]
        )

        workspace_group.permissions.set(permissions)

        super(Workspace, self).save(*args, **kwargs)

and I am creating the Workspace instance in python shell and in views.py, using the following command:

workspace, _ = Workspace.objects.get_or_create(name="[ANY-NAME-HERE]")

Full error details are

Group matching query does not exist.
Traceback (most recent call last):
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\backends\utils.py", line 89, in _execute    return self.cursor.execute(sql, params)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\backends\mysql\base.py", line 75, in execute
    return self.cursor.execute(query, args)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\MySQLdb\cursors.py", line 206, in execute
    res = self._query(query)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\MySQLdb\cursors.py", line 319, in _query
    db.query(q)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\MySQLdb\connections.py", line 254, in query       
    _mysql.connection.query(self, query)
MySQLdb._exceptions.IntegrityError: (1062, "Duplicate entry '7-can_remove_from_workspace_testworkspace' for key 'auth_permission.auth_permission_content_type_id_codename_01ab375a_uniq'")

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\models\query.py", line 514, in create   
    obj.save(force_insert=True, using=self.db)
  File "D:\Projects\meistery\projects\pricing_password_management_poc\inviteandresetpass\apps\accounts\models.py", line 500, in save
    Permission.objects.get_or_create(
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\models\query.py", line 514, in create   
    obj.save(force_insert=True, using=self.db)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\models\base.py", line 806, in save      
    self.save_base(
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\models\base.py", line 857, in save_base 
    updated = self._save_table(
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\models\base.py", line 1000, in _save_table
    results = self._do_insert(
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\models\base.py", line 1041, in _do_insert
    return manager._insert(
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\models\query.py", line 1434, in _insert 
    return query.get_compiler(using=using).execute_sql(returning_fields)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\models\sql\compiler.py", line 1621, in execute_sql
    cursor.execute(sql, params)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\backends\utils.py", line 103, in execute    return super().execute(sql, params)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\backends\utils.py", line 67, in execute 
    return self._execute_with_wrappers(
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\backends\utils.py", line 80, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\backends\utils.py", line 84, in _execute    with self.db.wrap_database_errors:
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\utils.py", line 91, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\backends\utils.py", line 89, in _execute    return self.cursor.execute(sql, params)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\backends\mysql\base.py", line 75, in execute
    return self.cursor.execute(query, args)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\MySQLdb\cursors.py", line 206, in execute
    res = self._query(query)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\MySQLdb\cursors.py", line 319, in _query
    db.query(q)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\MySQLdb\connections.py", line 254, in query       
    _mysql.connection.query(self, query)
django.db.utils.IntegrityError: (1062, "Duplicate entry '7-can_remove_from_workspace_testworkspace' for key 'auth_permission.auth_permission_content_type_id_codename_01ab375a_uniq'")

Anyone knows what’s wrong?

Hey there!

In this block, you are ignoring the exception (just printing it), i don’t know if this is what you really want.

But just to point out, in your traceback, in the very first line there is:
Group matching query does not exist.

Another thing is that, name_slug is empty on here:

That may be the cause of your issue.

This is what I don’t understand, because I have the group with that name.

OK, let me try this.

@leandrodesouzadev I just got remember that in save() method, I am automatically feeding the slugified string to name_slug field.

Please have a look. So while creating the instance, I don’t think that I need to pass another argument for name_slug field. Moreover, this issue only comes when I create the Workspace instance using python shell or in my views.py, I don’t see any error or issue when I create instance via Django Admin Interface.

One thing that i just noticed is that, the problem is not on the Workspace model.

Actually, the error comes from the Permission object

Maybe you need to supply some defaults?

I don’t know why but the error just changed, now I am getting this error:

django.db.utils.IntegrityError: (1062, "Duplicate entry '18' for key 'accounts_workspace.PRIMARY'")

Full error details:

Group matching query does not exist.
Traceback (most recent call last):
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\backends\utils.py", line 89, in _execute    return self.cursor.execute(sql, params)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\backends\mysql\base.py", line 75, in execute
    return self.cursor.execute(query, args)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\MySQLdb\cursors.py", line 206, in execute
    res = self._query(query)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\MySQLdb\cursors.py", line 319, in _query
    db.query(q)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\MySQLdb\connections.py", line 254, in query       
    _mysql.connection.query(self, query)
MySQLdb._exceptions.IntegrityError: (1062, "Duplicate entry '18' for key 'accounts_workspace.PRIMARY'")

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\models\query.py", line 514, in create   
    obj.save(force_insert=True, using=self.db)
  File "D:\Projects\meistery\projects\pricing_password_management_poc\inviteandresetpass\apps\accounts\models.py", line 523, in save
    super(Workspace, self).save(*args, **kwargs)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\models\base.py", line 806, in save      
    self.save_base(
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\models\base.py", line 857, in save_base 
    updated = self._save_table(
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\models\base.py", line 1000, in _save_table
    results = self._do_insert(
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\models\base.py", line 1041, in _do_insert
    return manager._insert(
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\models\query.py", line 1434, in _insert 
    return query.get_compiler(using=using).execute_sql(returning_fields)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\models\sql\compiler.py", line 1621, in execute_sql
    cursor.execute(sql, params)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\backends\utils.py", line 103, in execute    return super().execute(sql, params)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\backends\utils.py", line 67, in execute 
    return self._execute_with_wrappers(
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\backends\utils.py", line 80, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\backends\utils.py", line 84, in _execute    with self.db.wrap_database_errors:
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\utils.py", line 91, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\backends\utils.py", line 89, in _execute    return self.cursor.execute(sql, params)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\django\db\backends\mysql\base.py", line 75, in execute
    return self.cursor.execute(query, args)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\MySQLdb\cursors.py", line 206, in execute
    res = self._query(query)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\MySQLdb\cursors.py", line 319, in _query
    db.query(q)
  File "D:\Projects\meistery\venvs\inviteandresetpass\lib\site-packages\MySQLdb\connections.py", line 254, in query       
    _mysql.connection.query(self, query)
django.db.utils.IntegrityError: (1062, "Duplicate entry '18' for key 'accounts_workspace.PRIMARY'")

Ok ,that’s actually a bit tricky.

Notice that when Django is calling save, it’s passing the argument force_insert=True

And you if take a look into your models.pysave method, you call the super().save() twice.
Here:

and here:

So it’s trying to create the object twice due to the force_insert=True.
On the second super().save call, you must remove/update the force_insert kwarg.
You can do that by doing:
kwargs["force_insert"] = False
before the second super().save call.

1 Like

Should I pass this in the first super().save call?

I think that if the force_insert argument was supplied in the first call, you should leave it like that.
But on the second call, you will be creating two objects if force_insert is given.

I meant this:

        # Your code ...
        workspace_group.permissions.set(permissions)

        kwargs[“force_insert”] = False
        super(Workspace, self).save(*args, **kwargs)

I did it this way, but’ there’s an issue now. Now everytime I call Workspace.objects.create() method, passing same name to it, each time it is creating the instance with that same name, that should not happen because I have put the name field as UNIQUE. Why is it creating instances with duplicate names?

Are your migrations up to date?

1 Like

That was it, I had not migrated the latest changes. Just did this and now it is not making duplicates. But, I am still getting only one line error though and that is:

Group matching query does not exist.

This is only one error, and the group is being created (because I can see in Django Admin interface and permissions are added to that group as well), but still this error is coming.

You are seeing the Group being created because it does not existed. And even if it existed, you are deleting it, and the recreating.

So I have one question.
Why are you trying to get the Group, just to delete it, and later trying to get_or_create?

So if you want to just delete a group with that name, you can replace this:

With:

Group.objects.filter(name=self.name).delete()
This will not raise any errors if there is no matching Group. If you need to know if it had deleted any rows, the delete method returns an int of how many rows were deleted.

I am deleting the group because I want to delete the default group the django creates when an object is created, and then create my own customized group.

Great!
Take a look in my other reply.

I did that

It works fine now, no duplicate objects and no group error, but the strange behave is now that it does not even show error of duplication, it just shows nothing if I repeat the Workspace.objects.create() command supplying the same name twice or more, and if I change the name it creates the new object which is fine, but again running the same command should throw an error of duplication like it was throwing when I migrated my changes upon your advice.

My bad, I was using Workspace.objects.get() command instead of Workspace.objects.create(). So, finally everything is perfect now.

1 Like