377 lines
14 KiB
Python
377 lines
14 KiB
Python
# Generated by Django 5.2.5 on 2025-08-28 05:18
|
||
|
||
import card.storage
|
||
import django.db.models.deletion
|
||
from django.conf import settings
|
||
from django.db import migrations, models
|
||
|
||
|
||
class Migration(migrations.Migration):
|
||
|
||
initial = True
|
||
|
||
dependencies = [
|
||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||
]
|
||
|
||
operations = [
|
||
migrations.CreateModel(
|
||
name="Food",
|
||
fields=[
|
||
(
|
||
"id",
|
||
models.BigAutoField(
|
||
auto_created=True,
|
||
primary_key=True,
|
||
serialize=False,
|
||
verbose_name="ID",
|
||
),
|
||
),
|
||
("name", models.CharField(max_length=100, verbose_name="食物名称")),
|
||
(
|
||
"food_type",
|
||
models.CharField(
|
||
choices=[
|
||
("fruit", "水果"),
|
||
("vegetable", "蔬菜"),
|
||
("meat", "肉类"),
|
||
("seafood", "海鲜"),
|
||
("dairy", "乳制品"),
|
||
("grain", "谷物"),
|
||
("snack", "零食"),
|
||
("drink", "饮品"),
|
||
("dessert", "甜品"),
|
||
("spice", "调料"),
|
||
("other", "其他"),
|
||
],
|
||
max_length=20,
|
||
verbose_name="食物类型",
|
||
),
|
||
),
|
||
(
|
||
"description",
|
||
models.TextField(blank=True, null=True, verbose_name="食物描述"),
|
||
),
|
||
(
|
||
"rarity",
|
||
models.CharField(
|
||
choices=[
|
||
("common", "普通"),
|
||
("uncommon", "不常见"),
|
||
("rare", "稀有"),
|
||
("epic", "史诗"),
|
||
("legendary", "传说"),
|
||
("mythic", "神话"),
|
||
],
|
||
default="common",
|
||
max_length=20,
|
||
verbose_name="稀有程度",
|
||
),
|
||
),
|
||
(
|
||
"image",
|
||
models.ImageField(
|
||
blank=True,
|
||
help_text="食物的展示图片",
|
||
null=True,
|
||
storage=card.storage.OSSStorage(base_dir="foods"),
|
||
upload_to="images/",
|
||
verbose_name="食物图片",
|
||
),
|
||
),
|
||
(
|
||
"animation_file",
|
||
models.FileField(
|
||
blank=True,
|
||
help_text="食物的动画文件,支持gif/mp4等格式",
|
||
null=True,
|
||
storage=card.storage.OSSStorage(base_dir="foods"),
|
||
upload_to="animations/",
|
||
verbose_name="动画文件",
|
||
),
|
||
),
|
||
(
|
||
"sound_effect",
|
||
models.FileField(
|
||
blank=True,
|
||
help_text="食物相关的音效文件,如咀嚼声、烹饪声等",
|
||
null=True,
|
||
storage=card.storage.OSSStorage(base_dir="foods"),
|
||
upload_to="sounds/",
|
||
verbose_name="音效文件",
|
||
),
|
||
),
|
||
(
|
||
"calories",
|
||
models.PositiveIntegerField(
|
||
blank=True,
|
||
help_text="每100g的卡路里",
|
||
null=True,
|
||
verbose_name="卡路里",
|
||
),
|
||
),
|
||
(
|
||
"taste_tags",
|
||
models.CharField(
|
||
blank=True,
|
||
help_text="用逗号分隔,如:甜,酸,脆",
|
||
max_length=200,
|
||
null=True,
|
||
verbose_name="口味标签",
|
||
),
|
||
),
|
||
(
|
||
"cooking_methods",
|
||
models.TextField(blank=True, null=True, verbose_name="烹饪方法"),
|
||
),
|
||
(
|
||
"nutritional_value",
|
||
models.TextField(blank=True, null=True, verbose_name="营养价值"),
|
||
),
|
||
(
|
||
"effect_description",
|
||
models.TextField(
|
||
blank=True,
|
||
help_text="在游戏中的特殊效果",
|
||
null=True,
|
||
verbose_name="效果描述",
|
||
),
|
||
),
|
||
(
|
||
"boost_attributes",
|
||
models.JSONField(
|
||
blank=True,
|
||
help_text="JSON格式的属性加成数据",
|
||
null=True,
|
||
verbose_name="属性加成",
|
||
),
|
||
),
|
||
(
|
||
"unlock_condition",
|
||
models.TextField(blank=True, null=True, verbose_name="解锁条件"),
|
||
),
|
||
(
|
||
"usage_limit",
|
||
models.PositiveIntegerField(
|
||
blank=True,
|
||
help_text="0表示无限制",
|
||
null=True,
|
||
verbose_name="使用次数限制",
|
||
),
|
||
),
|
||
(
|
||
"status",
|
||
models.CharField(
|
||
choices=[
|
||
("draft", "草稿"),
|
||
("published", "已发布"),
|
||
("archived", "已归档"),
|
||
],
|
||
default="draft",
|
||
max_length=20,
|
||
verbose_name="状态",
|
||
),
|
||
),
|
||
(
|
||
"is_limited",
|
||
models.BooleanField(default=False, verbose_name="限时食物"),
|
||
),
|
||
(
|
||
"available_from",
|
||
models.DateTimeField(
|
||
blank=True, null=True, verbose_name="开始时间"
|
||
),
|
||
),
|
||
(
|
||
"available_until",
|
||
models.DateTimeField(
|
||
blank=True, null=True, verbose_name="结束时间"
|
||
),
|
||
),
|
||
(
|
||
"created_at",
|
||
models.DateTimeField(auto_now_add=True, verbose_name="创建时间"),
|
||
),
|
||
(
|
||
"updated_at",
|
||
models.DateTimeField(auto_now=True, verbose_name="更新时间"),
|
||
),
|
||
(
|
||
"published_at",
|
||
models.DateTimeField(
|
||
blank=True, null=True, verbose_name="发布时间"
|
||
),
|
||
),
|
||
],
|
||
options={
|
||
"verbose_name": "食物",
|
||
"verbose_name_plural": "食物",
|
||
"ordering": ["-created_at"],
|
||
"indexes": [
|
||
models.Index(fields=["name"], name="food_app_fo_name_28ef64_idx"),
|
||
models.Index(
|
||
fields=["food_type"], name="food_app_fo_food_ty_97e8ea_idx"
|
||
),
|
||
models.Index(
|
||
fields=["rarity"], name="food_app_fo_rarity_d9a2f0_idx"
|
||
),
|
||
models.Index(
|
||
fields=["status"], name="food_app_fo_status_be68b4_idx"
|
||
),
|
||
models.Index(
|
||
fields=["created_at"], name="food_app_fo_created_e9bf8b_idx"
|
||
),
|
||
],
|
||
},
|
||
),
|
||
migrations.CreateModel(
|
||
name="FoodUsageLog",
|
||
fields=[
|
||
(
|
||
"id",
|
||
models.BigAutoField(
|
||
auto_created=True,
|
||
primary_key=True,
|
||
serialize=False,
|
||
verbose_name="ID",
|
||
),
|
||
),
|
||
(
|
||
"used_at",
|
||
models.DateTimeField(auto_now_add=True, verbose_name="使用时间"),
|
||
),
|
||
(
|
||
"effect_applied",
|
||
models.JSONField(
|
||
blank=True,
|
||
help_text="JSON格式的效果数据",
|
||
null=True,
|
||
verbose_name="应用效果",
|
||
),
|
||
),
|
||
("notes", models.TextField(blank=True, null=True, verbose_name="备注")),
|
||
(
|
||
"usage_context",
|
||
models.CharField(
|
||
blank=True,
|
||
help_text="如:战斗中、休息时、特殊活动等",
|
||
max_length=100,
|
||
null=True,
|
||
verbose_name="使用场景",
|
||
),
|
||
),
|
||
(
|
||
"food",
|
||
models.ForeignKey(
|
||
on_delete=django.db.models.deletion.CASCADE,
|
||
related_name="usage_logs",
|
||
to="food_app.food",
|
||
verbose_name="食物",
|
||
),
|
||
),
|
||
(
|
||
"user",
|
||
models.ForeignKey(
|
||
on_delete=django.db.models.deletion.CASCADE,
|
||
related_name="food_usage_logs",
|
||
to=settings.AUTH_USER_MODEL,
|
||
verbose_name="用户",
|
||
),
|
||
),
|
||
],
|
||
options={
|
||
"verbose_name": "食物使用记录",
|
||
"verbose_name_plural": "食物使用记录",
|
||
"ordering": ["-used_at"],
|
||
"indexes": [
|
||
models.Index(
|
||
fields=["user"], name="food_app_fo_user_id_979fc1_idx"
|
||
),
|
||
models.Index(
|
||
fields=["food"], name="food_app_fo_food_id_210b62_idx"
|
||
),
|
||
models.Index(
|
||
fields=["used_at"], name="food_app_fo_used_at_c7731d_idx"
|
||
),
|
||
],
|
||
},
|
||
),
|
||
migrations.CreateModel(
|
||
name="UserFood",
|
||
fields=[
|
||
(
|
||
"id",
|
||
models.BigAutoField(
|
||
auto_created=True,
|
||
primary_key=True,
|
||
serialize=False,
|
||
verbose_name="ID",
|
||
),
|
||
),
|
||
(
|
||
"quantity",
|
||
models.PositiveIntegerField(default=1, verbose_name="拥有数量"),
|
||
),
|
||
(
|
||
"used_count",
|
||
models.PositiveIntegerField(default=0, verbose_name="已使用次数"),
|
||
),
|
||
(
|
||
"obtained_at",
|
||
models.DateTimeField(auto_now_add=True, verbose_name="获得时间"),
|
||
),
|
||
(
|
||
"obtained_method",
|
||
models.CharField(
|
||
blank=True,
|
||
help_text="如:购买、奖励、活动等",
|
||
max_length=50,
|
||
null=True,
|
||
verbose_name="获得方式",
|
||
),
|
||
),
|
||
(
|
||
"last_used_at",
|
||
models.DateTimeField(
|
||
blank=True, null=True, verbose_name="最后使用时间"
|
||
),
|
||
),
|
||
(
|
||
"food",
|
||
models.ForeignKey(
|
||
on_delete=django.db.models.deletion.CASCADE,
|
||
related_name="users",
|
||
to="food_app.food",
|
||
verbose_name="食物",
|
||
),
|
||
),
|
||
(
|
||
"user",
|
||
models.ForeignKey(
|
||
on_delete=django.db.models.deletion.CASCADE,
|
||
related_name="foods",
|
||
to=settings.AUTH_USER_MODEL,
|
||
verbose_name="用户",
|
||
),
|
||
),
|
||
],
|
||
options={
|
||
"verbose_name": "用户食物",
|
||
"verbose_name_plural": "用户食物",
|
||
"ordering": ["-obtained_at"],
|
||
"indexes": [
|
||
models.Index(
|
||
fields=["user"], name="food_app_us_user_id_a2075b_idx"
|
||
),
|
||
models.Index(
|
||
fields=["food"], name="food_app_us_food_id_ea7000_idx"
|
||
),
|
||
models.Index(
|
||
fields=["obtained_at"], name="food_app_us_obtaine_13d155_idx"
|
||
),
|
||
],
|
||
"unique_together": {("user", "food")},
|
||
},
|
||
),
|
||
]
|