serializers.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. from rest_framework import serializers
  2. from .models import City, Attraction, UserPreference, TravelPlan, DayPlan, DayPlanAttraction
  3. from django.contrib.auth import get_user_model
  4. User = get_user_model()
  5. # class CitySerializer(serializers.ModelSerializer):
  6. # is_available = serializers.BooleanField(source='is_hot') # Map is_hot to is_available
  7. #
  8. # class Meta:
  9. # model = City
  10. # fields = ['id', 'name', 'is_available'] # Keep is_available in response
  11. #
  12. #
  13. # class AttractionSerializer(serializers.ModelSerializer):
  14. # city = CitySerializer(read_only=True)
  15. #
  16. # class Meta:
  17. # model = Attraction
  18. # fields = ['id', 'city', 'name', 'description', 'short_desc', 'address',
  19. # 'ticket_price', 'open_hours', 'image', 'tags', 'is_featured']
  20. class CitySerializer(serializers.ModelSerializer):
  21. class Meta:
  22. model = City
  23. fields = ['id', 'name', 'code', 'image', 'description']
  24. class AttractionSerializer(serializers.ModelSerializer):
  25. city = CitySerializer(read_only=True)
  26. tags = serializers.SerializerMethodField()
  27. image_url = serializers.SerializerMethodField()
  28. class Meta:
  29. model = Attraction
  30. fields = ['id', 'city', 'name', 'description', 'short_desc', 'address',
  31. 'ticket_price', 'open_hours', 'image_url', 'tags', 'is_featured']
  32. def get_tags(self, obj):
  33. # 确保返回的是列表,即使数据库中是字符串
  34. if isinstance(obj.tags, str):
  35. return [tag.strip() for tag in obj.tags.split(',')]
  36. return obj.tags or []
  37. def get_image_url(self, obj):
  38. if obj.image:
  39. return obj.image.url
  40. return None
  41. class RedTourismPlanSerializer(serializers.Serializer):
  42. title = serializers.CharField()
  43. description = serializers.CharField()
  44. days = serializers.ListField(child=serializers.DictField())
  45. red_tourism_tips = serializers.ListField(
  46. child=serializers.CharField(),
  47. required=False
  48. )
  49. suitable_for = serializers.CharField(
  50. required=False,
  51. default="适合党员干部、学生团体等"
  52. )
  53. def validate(self, data):
  54. """验证至少包含2个红色景点"""
  55. red_attractions = 0
  56. for day in data.get('days', []):
  57. for att in day.get('attractions', []):
  58. if att.get('is_red_tourism', False):
  59. red_attractions += 1
  60. if red_attractions < 2:
  61. raise serializers.ValidationError("行程必须包含至少2个红色景点")
  62. return data
  63. class UserPreferenceSerializer(serializers.ModelSerializer):
  64. cities = CitySerializer(many=True, read_only=True)
  65. class Meta:
  66. model = UserPreference
  67. fields = ['id', 'cities', 'days', 'interests', 'transport', 'custom_requirements']
  68. class DayPlanAttractionSerializer(serializers.ModelSerializer):
  69. attraction = AttractionSerializer(read_only=True)
  70. class Meta:
  71. model = DayPlanAttraction
  72. fields = ['id', 'attraction', 'order', 'visit_time', 'notes']
  73. class DayPlanSerializer(serializers.ModelSerializer):
  74. attractions = DayPlanAttractionSerializer(many=True, read_only=True)
  75. class Meta:
  76. model = DayPlan
  77. fields = ['id', 'day', 'theme', 'description', 'transport', 'attractions']
  78. class TravelPlanSerializer(serializers.ModelSerializer):
  79. day_plans = DayPlanSerializer(many=True, read_only=True)
  80. class Meta:
  81. model = TravelPlan
  82. fields = ['id', 'title', 'description', 'days', 'suitable_for', 'status', 'day_plans', 'created_at']
  83. class TravelPlanCreateSerializer(serializers.ModelSerializer):
  84. class Meta:
  85. model = TravelPlan
  86. fields = ['preference', 'title', 'description', 'days', 'suitable_for']
  87. class UserPreferenceCreateSerializer(serializers.ModelSerializer):
  88. city_ids = serializers.ListField(
  89. child=serializers.IntegerField(),
  90. write_only=True,
  91. required=True
  92. )
  93. class Meta:
  94. model = UserPreference
  95. fields = ['city_ids', 'days', 'interests', 'transport', 'custom_requirements']
  96. def create(self, validated_data):
  97. city_ids = validated_data.pop('city_ids')
  98. preference = UserPreference.objects.create(**validated_data)
  99. preference.cities.set(city_ids)
  100. return preference