from django.db import models from django.contrib.auth import get_user_model User = get_user_model() class City(models.Model): name = models.CharField(max_length=50, verbose_name="城市名称") code = models.CharField(max_length=20, unique=True, verbose_name="城市代码") description = models.TextField(verbose_name="城市描述", blank=True) image = models.ImageField(upload_to='cities/', verbose_name="城市图片", null=True, blank=True) is_hot = models.BooleanField(default=False, verbose_name="是否热门") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = "城市" verbose_name_plural = "城市" def __str__(self): return self.name class Attraction(models.Model): city = models.ForeignKey(City, on_delete=models.CASCADE, related_name='attractions') name = models.CharField(max_length=100, verbose_name="景点名称") description = models.TextField(verbose_name="景点描述") short_desc = models.CharField(max_length=200, verbose_name="简短描述") address = models.CharField(max_length=200, verbose_name="地址") latitude = models.FloatField(verbose_name="纬度", null=True, blank=True) longitude = models.FloatField(verbose_name="经度", null=True, blank=True) ticket_price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name="门票价格", default=0) open_hours = models.CharField(max_length=100, verbose_name="开放时间", blank=True) image = models.ImageField(upload_to='attractions/', verbose_name="景点图片", null=True, blank=True) tags = models.JSONField(default=list, verbose_name="标签") history = models.TextField(verbose_name="历史背景", blank=True) is_featured = models.BooleanField(default=False, verbose_name="是否特色") created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: verbose_name = "景点" verbose_name_plural = "景点" def __str__(self): return f"{self.name} ({self.city.name})" class UserPreference(models.Model): TRANSPORT_CHOICES = [ ('walking', '步行'), ('driving', '自驾'), ('public', '公共交通'), ('mixed', '混合'), ] user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='preferences', verbose_name="用户") cities = models.ManyToManyField(City, verbose_name="选择城市") days = models.PositiveSmallIntegerField(verbose_name="旅行天数") interests = models.JSONField(default=list, verbose_name="兴趣偏好") transport = models.CharField(max_length=20, choices=TRANSPORT_CHOICES, verbose_name="出行方式") custom_requirements = models.TextField(verbose_name="特殊需求", blank=True) created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = "用户偏好" verbose_name_plural = "用户偏好" def __str__(self): return f"{self.user.username}的偏好设置" class TravelPlan(models.Model): STATUS_CHOICES = [ ('generating', '生成中'), ('completed', '已完成'), ('failed', '失败'), ] user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='travel_plans', verbose_name="用户") preference = models.ForeignKey(UserPreference, on_delete=models.CASCADE, related_name='plans', verbose_name="偏好设置") title = models.CharField(max_length=100, verbose_name="行程标题") description = models.TextField(verbose_name="行程描述") days = models.PositiveSmallIntegerField(verbose_name="天数") suitable_for = models.CharField(max_length=100, verbose_name="适合人群", blank=True) status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='generating', verbose_name="状态") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = "旅行计划" verbose_name_plural = "旅行计划" def __str__(self): return f"{self.user.username}的{self.title}" class DayPlan(models.Model): travel_plan = models.ForeignKey(TravelPlan, on_delete=models.CASCADE, related_name='day_plans', verbose_name="旅行计划") day = models.PositiveSmallIntegerField(verbose_name="第几天") theme = models.CharField(max_length=100, verbose_name="当日主题") description = models.TextField(verbose_name="当日描述", blank=True) transport = models.CharField(max_length=200, verbose_name="交通方式", blank=True) created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = "每日计划" verbose_name_plural = "每日计划" ordering = ['travel_plan', 'day'] def __str__(self): return f"{self.travel_plan.title} - 第{self.day}天" class DayPlanAttraction(models.Model): day_plan = models.ForeignKey(DayPlan, on_delete=models.CASCADE, related_name='attractions', verbose_name="每日计划") attraction = models.ForeignKey(Attraction, on_delete=models.CASCADE, verbose_name="景点") order = models.PositiveSmallIntegerField(verbose_name="顺序") visit_time = models.CharField(max_length=50, verbose_name="参观时间", blank=True) notes = models.TextField(verbose_name="备注", blank=True) created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") class Meta: verbose_name = "每日计划景点" verbose_name_plural = "每日计划景点" ordering = ['day_plan', 'order'] def __str__(self): return f"{self.day_plan} - {self.attraction.name}"