serializers.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. from rest_framework import serializers
  2. from .models import City, Attraction
  3. from django.contrib.auth import get_user_model
  4. from django.conf import settings
  5. from .models import RedTourismPlan, RedTourismDayPlan, RedTourismSpot
  6. User = get_user_model()
  7. class CitySerializer(serializers.ModelSerializer):
  8. class Meta:
  9. model = City
  10. fields = ['id', 'name', 'code', 'image', 'description', 'latitude', 'longitude']
  11. class AttractionSerializer(serializers.ModelSerializer):
  12. city = CitySerializer(read_only=True)
  13. tags = serializers.SerializerMethodField()
  14. image_url = serializers.SerializerMethodField()
  15. class Meta:
  16. model = Attraction
  17. fields = ['id', 'city', 'name', 'description', 'short_desc', 'address',
  18. 'ticket_price', 'open_hours', 'image_url', 'tags', 'is_featured',
  19. 'latitude', 'longitude']
  20. def get_tags(self, obj):
  21. if isinstance(obj.tags, str):
  22. return [tag.strip() for tag in obj.tags.split(',')]
  23. return obj.tags or []
  24. def get_image_url(self, obj):
  25. # 确保使用正确的媒体URL
  26. if obj.image:
  27. return self.context['request'].build_absolute_uri(obj.image.url)
  28. return f"{settings.MEDIA_URL}attractions/{obj.name}.png"
  29. # class RedTourismPlanSerializer(serializers.Serializer):
  30. # plan_id = serializers.IntegerField(required=False, allow_null=True)
  31. # city_ids = serializers.ListField(
  32. # child=serializers.IntegerField(),
  33. # required=True
  34. # )
  35. # days = serializers.IntegerField(min_value=1, max_value=7, required=True)
  36. # interests = serializers.ListField(
  37. # child=serializers.CharField(),
  38. # required=True
  39. # )
  40. # transport = serializers.CharField(required=True)
  41. # custom_requirements = serializers.CharField(required=False, allow_blank=True)
  42. # previous_plan = serializers.DictField(required=False, default=dict)
  43. # cities = CitySerializer(many=True, read_only=True)
  44. class RedTourismSpotSerializer(serializers.ModelSerializer):
  45. class Meta:
  46. model = RedTourismSpot
  47. fields = '__all__'
  48. class RedTourismDayPlanSerializer(serializers.ModelSerializer):
  49. spots = RedTourismSpotSerializer(many=True, read_only=True)
  50. class Meta:
  51. model = RedTourismDayPlan
  52. fields = '__all__'
  53. class RedTourismPlanSerializer(serializers.ModelSerializer):
  54. day_plans = RedTourismDayPlanSerializer(many=True, read_only=True)
  55. cities = CitySerializer(many=True, read_only=True)
  56. created_at = serializers.DateTimeField(format="%Y-%m-%d") # 格式化日期
  57. class Meta:
  58. model = RedTourismPlan
  59. fields = '__all__'
  60. read_only_fields = ('user', 'created_at', 'last_updated')
  61. # serializers.py
  62. class SaveRedTourismPlanSerializer(serializers.Serializer):
  63. plan_data = serializers.JSONField()
  64. city_ids = serializers.ListField(
  65. child=serializers.IntegerField(),
  66. required=True
  67. )
  68. def validate_plan_data(self, value):
  69. required_fields = ['title', 'description', 'days', 'statistics']
  70. for field in required_fields:
  71. if field not in value:
  72. raise serializers.ValidationError(f"缺少必要字段: {field}")
  73. return value
  74. def validate_city_ids(self, value):
  75. if not value:
  76. raise serializers.ValidationError("至少需要一个城市ID")
  77. return value
  78. # serializers.py
  79. from rest_framework import serializers
  80. class RedTourismRegenerateSerializer(serializers.Serializer):
  81. plan_id = serializers.IntegerField(required=False, allow_null=True)
  82. city_ids = serializers.ListField(
  83. child=serializers.IntegerField(),
  84. required=True
  85. )
  86. days = serializers.IntegerField(min_value=1, max_value=7, required=True)
  87. interests = serializers.ListField(
  88. child=serializers.CharField(),
  89. required=True
  90. )
  91. transport = serializers.ChoiceField(
  92. choices=['public', 'drive', 'walk', 'bike'],
  93. required=True
  94. )
  95. custom_requirements = serializers.CharField(required=False, allow_blank=True)
  96. previous_plan = serializers.DictField(required=True)
  97. def validate_previous_plan(self, value):
  98. """验证previous_plan字段的结构"""
  99. if not isinstance(value, dict):
  100. raise serializers.ValidationError("previous_plan必须是字典")
  101. # 确保有days字段
  102. if 'days' not in value:
  103. raise serializers.ValidationError("previous_plan必须包含days字段")
  104. if not isinstance(value['days'], list):
  105. raise serializers.ValidationError("previous_plan.days必须是列表")
  106. return value