from django.conf import settings from django.db import models class UserPet(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="pet") name = models.CharField(max_length=40, default="小葫芦") level = models.PositiveIntegerField(default=1) experience = models.PositiveIntegerField(default=0) appearance = models.JSONField(default=dict, blank=True) created_at = models.DateTimeField(auto_now_add=True) class UserAbility(models.Model): class Dimension(models.TextChoices): VISION = "vision", "眼光" HUMANITIES = "humanities", "人文" DETECTION = "detection", "侦探" MODELING = "modeling", "建模" CONNECTION = "connection", "联结" user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="abilities") dimension = models.CharField(max_length=20, choices=Dimension.choices) level = models.PositiveIntegerField(default=0) fragments = models.PositiveIntegerField(default=0) class Meta: constraints = [ models.UniqueConstraint(fields=("user", "dimension"), name="unique_user_ability") ] class Card(models.Model): slug = models.SlugField(unique=True) name = models.CharField(max_length=80) mathematician = models.CharField(max_length=80) description = models.TextField() image = models.CharField(max_length=200, blank=True) def __str__(self): return self.name class UserCard(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="cards") card = models.ForeignKey(Card, on_delete=models.PROTECT) source = models.CharField(max_length=80) acquired_at = models.DateTimeField(auto_now_add=True) class Meta: constraints = [ models.UniqueConstraint(fields=("user", "card"), name="unique_user_card") ] class RewardTransaction(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="rewards") idempotency_key = models.CharField(max_length=100) source = models.CharField(max_length=80) rewards = models.JSONField(default=dict) created_at = models.DateTimeField(auto_now_add=True) class Meta: constraints = [ models.UniqueConstraint( fields=("user", "idempotency_key"), name="unique_user_reward_transaction" ) ]