from django.db import models from django.conf import settings from django.contrib.auth.models import AbstractUser, Group, Permission from django.db.models import UniqueConstraint, Q from rest_framework.authtoken.models import Token as DefaultToken class ParadiseUser(AbstractUser): """ 自定义用户模型 """ phone_number = models.CharField('手机号', max_length=20, unique=True, null=True, blank=True) email = models.EmailField('邮箱', unique=True, null=True, blank=True) # 新增用户信息字段 GENDER_CHOICES = ( ('M', '男'), ('F', '女'), ('O', '其他'), ) MBTI_CHOICES = ( ('INTJ', 'INTJ'), ('INTP', 'INTP'), ('ENTJ', 'ENTJ'), ('ENTP', 'ENTP'), ('INFJ', 'INFJ'), ('INFP', 'INFP'), ('ENFJ', 'ENFJ'), ('ENFP', 'ENFP'), ('ISTJ', 'ISTJ'), ('ISFJ', 'ISFJ'), ('ESTJ', 'ESTJ'), ('ESFJ', 'ESFJ'), ('ISTP', 'ISTP'), ('ISFP', 'ISFP'), ('ESTP', 'ESTP'), ('ESFP', 'ESFP'), ) favorability = models.IntegerField('好感度', default=0) gender = models.CharField('性别', max_length=1, choices=GENDER_CHOICES, null=True, blank=True) resident_city = models.CharField('常驻城市', max_length=50, null=True, blank=True) birthday = models.DateField('生日', null=True, blank=True) zodiac_sign = models.CharField('星座', max_length=20, null=True, blank=True) mbti = models.CharField('MBTI性格', max_length=4, choices=MBTI_CHOICES, null=True, blank=True) interests = models.TextField('兴趣爱好', null=True, blank=True) social_identity = models.CharField('社会身份', max_length=50, null=True, blank=True) groups = models.ManyToManyField( Group, related_name="paradiseuser_set", blank=True, help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.", related_query_name="user", ) user_permissions = models.ManyToManyField( Permission, related_name="paradiseuser_set", blank=True, help_text="Specific permissions for this user.", related_query_name="user", ) class Meta: verbose_name = '用户' verbose_name_plural = '用户' ordering = ['-date_joined'] indexes = [ models.Index(fields=['username']), # 添加用户名索引 ] constraints = [ UniqueConstraint( fields=["phone_number"], condition=Q(phone_number__isnull=False), name="unique_phone_number", ) ] def __str__(self): return self.username or self.phone_number or self.email # class UserToken(DefaultToken): # user = models.OneToOneField( # settings.AUTH_USER_MODEL, # related_name='auth_token', # on_delete=models.CASCADE # ) class AffinityRule(models.Model): """好感度规则:定义哪些行为可以获得好感度积分""" name = models.CharField('规则名称', max_length=100) description = models.TextField('规则描述', blank=True) points = models.IntegerField('积分', default=0) daily_limit = models.IntegerField('每日上限', null=True, blank=True) is_active = models.BooleanField('已启用', default=True) created_at = models.DateTimeField('创建时间', auto_now_add=True) updated_at = models.DateTimeField('更新时间', auto_now=True) class Meta: verbose_name = '好感度规则' verbose_name_plural = '好感度规则' ordering = ['-created_at'] def __str__(self): return self.name class AffinityLevel(models.Model): """好感度等级:定义不同好感度区间对应的等级和奖励""" level = models.IntegerField('等级', unique=True) name = models.CharField('等级名称', max_length=50) description = models.TextField('等级描述', blank=True) required_points = models.IntegerField('所需积分') rewards = models.JSONField('奖励', default=list) created_at = models.DateTimeField('创建时间', auto_now_add=True) updated_at = models.DateTimeField('更新时间', auto_now=True) class Meta: verbose_name = '好感度等级' verbose_name_plural = '好感度等级' ordering = ['level'] def __str__(self): return f"Lv{self.level} {self.name}"