diff --git a/aleksis/core/mixins.py b/aleksis/core/mixins.py
index e958c75f7ef56f837ee2f7137950dfb061690837..fa11c7cb1af486be694ff8d683e45ccfb76eb654 100644
--- a/aleksis/core/mixins.py
+++ b/aleksis/core/mixins.py
@@ -7,6 +7,7 @@ from django.contrib.sites.models import Site
 from django.db import models
 from django.db.models import QuerySet
 from django.forms.models import ModelForm, ModelFormMetaclass
+from django.utils.functional import lazy
 
 import reversion
 from easyaudit.models import CRUDEvent
@@ -196,6 +197,12 @@ class ExtensibleModel(models.Model):
             [(field.name, field.verbose_name or field.name) for field in cls.syncable_fields()]
         )
 
+    @classmethod
+    def syncable_fields_choices_lazy(cls) -> callable[[], Tuple[Tuple[str, str]]]:
+        """ Collect all fields that can be synced on a model """
+
+        return lazy(cls.syncable_field_choices, tuple)
+
     class Meta:
         abstract = True
 
diff --git a/aleksis/core/preferences.py b/aleksis/core/preferences.py
index ad356dd0a66a181aebe27b35d940742c04eecf2e..95daabc5194c7bba089042ed7448aa94b263b5e5 100644
--- a/aleksis/core/preferences.py
+++ b/aleksis/core/preferences.py
@@ -157,7 +157,7 @@ class PrimaryGroupField(ChoicePreference):
     section = account
     name = "primary_group_field"
     default = "name"
-    choices = Person.syncable_fields_choices()
+    choices = Person.syncable_fields_choices_lazy()
     required = False
     verbose_name = _("Field on person to match primary group against")