from django.db import models from django.db.models import Prefetch from django.apps import apps class DeckNameTranslation(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=64) deck = models.ForeignKey("Deck", on_delete=models.PROTECT, related_name='name_translations') language = models.CharField(max_length=64) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return self.name class CardNameTranslation(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=64) card = models.ForeignKey("Card", on_delete=models.PROTECT, related_name='name_translations') language = models.CharField(max_length=64) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return self.name class RarityNameTranslation(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=64) rarity = models.ForeignKey("Rarity", on_delete=models.PROTECT, related_name='name_translations') language = models.CharField(max_length=64) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return self.name class CardSet(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=64) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return self.name class Deck(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=64) hex_color = models.CharField(max_length=9) cardset = models.ForeignKey("CardSet", on_delete=models.PROTECT, related_name='decks') created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return self.name class Rarity(models.Model): id = models.AutoField(primary_key=True) normalized_id = models.IntegerField(null=False) name = models.CharField(max_length=64) icons = models.CharField(max_length=64) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return self.name # Custom Manager for Card model class CardPrefetchManager(models.Manager): def get_queryset(self): return ( super() .get_queryset() .select_related("cardset", "rarity") .prefetch_related( "decks", "decks__cardset", ) ) class CardManager(models.Manager): def get_queryset(self): return ( super() .get_queryset() .select_related("cardset", "rarity") ) class Card(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=64) decks = models.ManyToManyField("Deck") cardset = models.ForeignKey("CardSet", on_delete=models.PROTECT, related_name='cards') cardnum = models.IntegerField() rarity = models.ForeignKey(Rarity, on_delete=models.PROTECT, related_name='cards') created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) # Use the custom manager to ensure optimized querysets everywhere. objects = CardPrefetchManager() objects_no_prefetch = CardManager() def __str__(self): # For display, we show the original rarity icons. return f"{self.name} {self.rarity.icons} {self.cardset.name}" @property def normalized_rarity(self): """ Returns the canonical rarity id for trade logic. """ return self.rarity.normalized_id