123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- 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}"
|