lty/qy_lty/userapp/models.py
pmc bd95ba470c feat: update admin panel, API modules, and add migrations
- Update food, outfits, props, home-decor pages and components
- Add permissions page and sidebar updates
- Update API client and all API modules (auth, food, dances, etc.)
- Add card model migrations for optional fields
- Update Django views, serializers, and authentication
- Add affinity level migrations and user app updates
- Add project documentation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 13:06:50 +08:00

115 lines
4.3 KiB
Python

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}"