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?