Here are my models, I’ve cut out the non-essential items for brevity:
class Profile(models.Model):
…
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
…
directory_optin = models.BooleanField(_('Directory opt-in'), default=False, db_index=True)
…
directory_classes = models.ManyToManyField('DirectoryLink3', through='DirectoryLink_profiles')
…
class DirectoryLink3(models.Model):
id = models.BigAutoField(primary_key=True)
uplink = models.ForeignKey('DirectoryLink2', to_field='catid', max_length=16, blank=True, null=True, db_index=True, on_delete=models.SET_NULL)
catid = models.CharField(max_length=16, blank=True, null=True, db_index=True)
description = models.CharField(max_length=128, blank=True, null=True, db_index=True)
createdate = models.DateTimeField(auto_now_add=True)
moddate = models.DateTimeField(auto_now=True)
class DirectoryLink2(models.Model):
id = models.BigAutoField(primary_key=True)
uplink = models.ForeignKey('DirectoryLink1', to_field='catid', max_length=16, blank=True, null=True, db_index=True, on_delete=models.SET_NULL)
catid = models.CharField(unique=True, max_length=16, blank=True, null=True, db_index=True)
description = models.CharField(max_length=128, blank=True, null=True, db_index=True)
createdate = models.DateTimeField(auto_now_add=True)
moddate = models.DateTimeField(auto_now=True)
class DirectoryLink1(models.Model):
id = models.BigAutoField(primary_key=True)
uplink = models.ForeignKey('DirectoryLink0', to_field='catid', max_length=16, blank=True, null=True, db_index=True, on_delete=models.SET_NULL)
catid = models.CharField(unique=True, max_length=16, blank=True, null=True, db_index=True)
description = models.CharField(max_length=128, blank=True, null=True, db_index=True)
createdate = models.DateTimeField(auto_now_add=True)
moddate = models.DateTimeField(auto_now=True
class DirectoryLink0(models.Model):
id = models.BigAutoField(primary_key=True)
uplink = models.CharField(max_length=16, blank=True, null=True, db_index=True)
catid = models.CharField(unique=True, max_length=16, blank=True, null=True, db_index=True)
description = models.CharField(max_length=128, blank=True, null=True, db_index=True)
createdate = models.DateTimeField(auto_now_add=True)
moddate = models.DateTimeField(auto_now=True)
class DirectoryLink_profiles(models.Model):
raw_id_fields = ('directorylink',)
id = models.BigAutoField(primary_key=True)
catpath = models.CharField(max_length=512, blank=True, null=True, db_index=True)
directorylink = models.ForeignKey(DirectoryLink3, null=True, on_delete=models.CASCADE)
profile = models.ForeignKey(Profile, verbose_name=_('profile'), null=True, on_delete=models.CASCADE)
The DirectoryLink0.uplink
field is redundant, therre would be nothing to link to.