lty/qy_lty/food_app/serializers.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

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("食物不存在")