from typing import TYPE_CHECKING from django.contrib import admin as django_admin from django.contrib.admin.exceptions import AlreadyRegistered # type: ignore from django.db import models class tMUser(models.Model): username = models.CharField(max_length=30, unique=True, primary_key=True) if TYPE_CHECKING: liked = models.Manager["tMMessage"] sent = models.Manager["tMMessage"] received = models.Manager["tMMessage"] def __str__(self) -> str: return self.username class tMMessage(models.Model): message_id = models.IntegerField(primary_key=True) content = models.CharField(max_length=10_000) response = models.CharField(max_length=10_000, blank=True, null=True) anonymous = models.BooleanField() likes = models.ManyToManyField(tMUser, through="tMM2MLike", related_name="liked") u_to = models.ForeignKey(tMUser, on_delete=models.CASCADE, related_name="received") if TYPE_CHECKING: u_from: tMUser | None else: u_from = models.ForeignKey(tMUser, on_delete=models.SET_NULL, blank=True, null=True, related_name="sent") def __str__(self) -> str: return f"({self.message_id}) {self.u_from.username if self.u_from else 'Anonymous'} messaged {self.u_to.username}" class tMM2MLike(models.Model): user = models.ForeignKey(tMUser, on_delete=models.CASCADE, related_name="liked_obj") message = models.ForeignKey(tMMessage, on_delete=models.CASCADE, related_name="likes_obj") class Meta: unique_together = ("user", "message") def __str__(self) -> str: return f"{self.user.username} liked message {self.message.message_id}" try: django_admin.site.register((tMUser, tMMessage, tMM2MLike)) except AlreadyRegistered: ...