- 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>
93 lines
3.6 KiB
Python
93 lines
3.6 KiB
Python
from rest_framework import serializers
|
|
from .models import Food, UserFood, FoodUsageLog
|
|
|
|
|
|
class FoodSerializer(serializers.ModelSerializer):
|
|
"""食物序列化器"""
|
|
|
|
taste_tags_list = serializers.ReadOnlyField(source='get_taste_tags_list')
|
|
is_available = serializers.ReadOnlyField()
|
|
rarity_display = serializers.ReadOnlyField(source='get_rarity_display')
|
|
food_type_display = serializers.ReadOnlyField(source='get_food_type_display')
|
|
status_display = serializers.ReadOnlyField(source='get_status_display')
|
|
|
|
class Meta:
|
|
model = Food
|
|
fields = [
|
|
'id', 'name', 'food_type', 'food_type_display', 'description',
|
|
'rarity', 'rarity_display', 'image', 'animation_file', 'sound_effect',
|
|
'calories', 'taste_tags', 'taste_tags_list', 'cooking_methods',
|
|
'nutritional_value', 'effect_description', 'boost_attributes',
|
|
'unlock_condition', 'usage_limit', 'status', 'status_display',
|
|
'is_limited', 'available_from', 'available_until', 'is_available',
|
|
'created_at', 'updated_at', 'published_at'
|
|
]
|
|
read_only_fields = ['created_at', 'updated_at', 'published_at']
|
|
|
|
|
|
class FoodListSerializer(serializers.ModelSerializer):
|
|
"""食物列表序列化器(简化版)"""
|
|
|
|
rarity_display = serializers.ReadOnlyField(source='get_rarity_display')
|
|
food_type_display = serializers.ReadOnlyField(source='get_food_type_display')
|
|
is_available = serializers.ReadOnlyField()
|
|
|
|
status_display = serializers.ReadOnlyField(source='get_status_display')
|
|
|
|
class Meta:
|
|
model = Food
|
|
fields = [
|
|
'id', 'name', 'food_type', 'food_type_display', 'rarity',
|
|
'rarity_display', 'image', 'calories', 'is_available',
|
|
'is_limited', 'status', 'status_display', 'published_at',
|
|
'created_at'
|
|
]
|
|
|
|
|
|
class UserFoodSerializer(serializers.ModelSerializer):
|
|
"""用户食物序列化器"""
|
|
|
|
food = FoodListSerializer(read_only=True)
|
|
can_use = serializers.ReadOnlyField()
|
|
user_name = serializers.ReadOnlyField(source='user.username')
|
|
|
|
class Meta:
|
|
model = UserFood
|
|
fields = [
|
|
'id', 'user', 'user_name', 'food', 'quantity', 'used_count',
|
|
'obtained_at', 'obtained_method', 'last_used_at', 'can_use'
|
|
]
|
|
read_only_fields = ['obtained_at', 'user']
|
|
|
|
|
|
class FoodUsageLogSerializer(serializers.ModelSerializer):
|
|
"""食物使用记录序列化器"""
|
|
|
|
food_name = serializers.ReadOnlyField(source='food.name')
|
|
user_name = serializers.ReadOnlyField(source='user.username')
|
|
|
|
class Meta:
|
|
model = FoodUsageLog
|
|
fields = [
|
|
'id', 'user', 'user_name', 'food', 'food_name', 'used_at',
|
|
'effect_applied', 'notes', 'usage_context'
|
|
]
|
|
read_only_fields = ['used_at', 'user']
|
|
|
|
|
|
class UseFoodSerializer(serializers.Serializer):
|
|
"""使用食物序列化器"""
|
|
|
|
food_id = serializers.IntegerField()
|
|
usage_context = serializers.CharField(max_length=100, required=False, allow_blank=True)
|
|
notes = serializers.CharField(required=False, allow_blank=True)
|
|
|
|
def validate_food_id(self, value):
|
|
"""验证食物ID"""
|
|
try:
|
|
food = Food.objects.get(id=value)
|
|
if not food.is_available():
|
|
raise serializers.ValidationError("该食物当前不可用")
|
|
return value
|
|
except Food.DoesNotExist:
|
|
raise serializers.ValidationError("食物不存在") |