diff --git a/aleksis/apps/alsijil/migrations/0013_fix_uniqueness_per_site.py b/aleksis/apps/alsijil/migrations/0013_fix_uniqueness_per_site.py
new file mode 100644
index 0000000000000000000000000000000000000000..ed4edc714dc1c9f7c5c82ca58d3edd6f1628891c
--- /dev/null
+++ b/aleksis/apps/alsijil/migrations/0013_fix_uniqueness_per_site.py
@@ -0,0 +1,49 @@
+# Generated by Django 3.2.3 on 2021-05-23 12:32
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('alsijil', '0012_unique_relation'),
+    ]
+
+    operations = [
+        migrations.AlterUniqueTogether(
+            name='lessondocumentation',
+            unique_together=set(),
+        ),
+        migrations.AlterUniqueTogether(
+            name='personalnote',
+            unique_together=set(),
+        ),
+        migrations.AddConstraint(
+            model_name='excusetype',
+            constraint=models.UniqueConstraint(fields=('site_id', 'short_name'), name='unique_excuse_short_name'),
+        ),
+        migrations.AddConstraint(
+            model_name='excusetype',
+            constraint=models.UniqueConstraint(fields=('site_id', 'name'), name='unique_excuse_name'),
+        ),
+        migrations.AddConstraint(
+            model_name='extramark',
+            constraint=models.UniqueConstraint(fields=('site_id', 'short_name'), name='unique_mark_short_name'),
+        ),
+        migrations.AddConstraint(
+            model_name='extramark',
+            constraint=models.UniqueConstraint(fields=('site_id', 'name'), name='unique_mark_name'),
+        ),
+        migrations.AddConstraint(
+            model_name='grouprole',
+            constraint=models.UniqueConstraint(fields=('site_id', 'name'), name='unique_role_per_site'),
+        ),
+        migrations.AddConstraint(
+            model_name='lessondocumentation',
+            constraint=models.UniqueConstraint(fields=('lesson_period', 'week', 'year', 'event', 'extra_lesson'), name='unique_documentation_per_object'),
+        ),
+        migrations.AddConstraint(
+            model_name='personalnote',
+            constraint=models.UniqueConstraint(fields=('lesson_period', 'week', 'year', 'event', 'extra_lesson'), name='unique_personal_note_per_object'),
+        ),
+    ]
diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index 94044b74a3f3c859cd95ae19290e375baf9ee595..51857750b434dc03b36c23b7c10f6fcca69ed013 100644
--- a/aleksis/apps/alsijil/models.py
+++ b/aleksis/apps/alsijil/models.py
@@ -61,6 +61,12 @@ class ExcuseType(ExtensibleModel):
         ordering = ["name"]
         verbose_name = _("Excuse type")
         verbose_name_plural = _("Excuse types")
+        constraints = [
+            models.UniqueConstraint(
+                fields=("site_id", "short_name"), name="unique_excuse_short_name"
+            ),
+            models.UniqueConstraint(fields=("site_id", "name"), name="unique_excuse_name"),
+        ]
 
 
 lesson_related_constraint_q = (
@@ -275,9 +281,12 @@ class PersonalNote(RegisterObjectRelatedMixin, ExtensibleModel):
         constraints = [
             CheckConstraint(
                 check=lesson_related_constraint_q, name="one_relation_only_personal_note"
-            )
+            ),
+            models.UniqueConstraint(
+                fields=("lesson_period", "week", "year", "event", "extra_lesson"),
+                name="unique_personal_note_per_object",
+            ),
         ]
-        unique_together = ["lesson_period", "week", "year", "event", "extra_lesson"]
 
 
 class LessonDocumentation(RegisterObjectRelatedMixin, ExtensibleModel):
@@ -362,9 +371,12 @@ class LessonDocumentation(RegisterObjectRelatedMixin, ExtensibleModel):
         constraints = [
             CheckConstraint(
                 check=lesson_related_constraint_q, name="one_relation_only_lesson_documentation",
-            )
+            ),
+            models.UniqueConstraint(
+                fields=("lesson_period", "week", "year", "event", "extra_lesson"),
+                name="unique_documentation_per_object",
+            ),
         ]
-        unique_together = ["lesson_period", "week", "year", "event", "extra_lesson"]
 
 
 class ExtraMark(ExtensibleModel):
@@ -387,6 +399,12 @@ class ExtraMark(ExtensibleModel):
         ordering = ["short_name"]
         verbose_name = _("Extra mark")
         verbose_name_plural = _("Extra marks")
+        constraints = [
+            models.UniqueConstraint(
+                fields=("site_id", "short_name"), name="unique_mark_short_name"
+            ),
+            models.UniqueConstraint(fields=("site_id", "name"), name="unique_mark_name"),
+        ]
 
 
 class GroupRole(ExtensibleModel):
@@ -402,6 +420,9 @@ class GroupRole(ExtensibleModel):
     class Meta:
         verbose_name = _("Group role")
         verbose_name_plural = _("Group roles")
+        constraints = [
+            models.UniqueConstraint(fields=("site_id", "name"), name="unique_role_per_site"),
+        ]
 
 
 class GroupRoleAssignment(GroupPropertiesMixin, ExtensibleModel):