我正在 django 和 mysql 中开发一个简单的餐厅应用程序,经过几天的谷歌搜索和研究,我无法为这个特定问题找到合适的答案,这是我的 django 模型
class MenuItem(models.Model):
menu_category = models.ForeignKey(MenuCategory, to_field='slug', on_delete=models.CASCADE)
name = models.CharField(max_length=30)
image = models.ImageField(upload_to='uploads/menu/')
slug = models.SlugField(null=True, blank=True, unique=True)
price = models.DecimalField(max_digits=9, decimal_places=0)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
问题来了: 例如,我有一个菜单项“MEXICAN BURGER”,我想询问用户他们对肉的选择......即鸡肉或牛肉,或者他们选择的面包,白色或棕色,
或者我可能有一个菜单项“煎蛋组合”,我想询问用户他们想要的煎蛋类型,例如(“西班牙煎蛋”、“菠菜和蘑菇煎蛋”)
或者我可能有一个 MenuItem“ESPRESSO”,我希望他们在 ('single', 'double') 之间进行选择
*一个菜单项可以有多个与之相关的选择,即汉堡项可以选择面包也可以选择肉 为了更好地了解我的问题,请访问此 link * 还有这个another link
答案 0 :(得分:0)
您可以根据需要创建另一个模型,例如MeatOption
并将其添加到 MenuItem 的外键中:
class MeatOption(models.Model):
meat_type = models.CharField(max_length=200)
class MenuItem(models.Model):
meat_type = models.ForeignKey(MeatOption, null=True, blank=True)
# rest of fields
理想情况下,您应该考虑对您的项目进行分类并将该分类反映到您的模型中。即,您可以拥有 Burgers 类、Beverages 类等,以便您只包含相关选项。
如果所有这些类别之间有共同的功能,您可以像这样从 Base MenuItem 类继承它:
class MenuItem(models.Model):
# common fields across all items go here
class Burger(MenuItem):
# burger-specific fields here
meat_type = models.ForeignKey(MeatOption)
class Omelette(MenuItem):
# omelette-specific fields here
ingredient = models.ManyToManyField(Ingredient)
class Ingredient(models.Model):
name = models.CharField(max_length=200)
细节当然取决于你的用例
答案 1 :(得分:0)
对此有不同的解决方案。
您为每个选择的类型和子类 MenuItem 以及这些 mixin 创建 Mixin。
from django.db.models import CharField, TextChoices, Model
class MeatChoices(TextChoices):
CHICKEN = 'chi'
BEEF = 'bee'
class MeatMixin(Model):
meat_choices = CharField(max_length=3, choices=MeatChoices.choices, default=MeatChoices.CHICKEN)
class MeatMenuItem(MeatMixin, MenuItem):
pass
每当向菜单中添加更多选项或在此方面更改菜单时,这将需要更改代码。
要允许 admin 用户通过 Django Admin 创建和添加选项到菜单项,您需要创建一个模型结构来指定选项:
from django.contrib.postgres.fields import ArrayField
from django.db.models import ManyToManyField, CharField, Model
class Ingredient(Model):
name = CharField(max_length=50, unique=True)
class IngredientChoiceGroup(Model):
name = CharField(max_length=50, unique=True)
# simple solution for postgres only:
# ingredients = ArrayField(CharField(max_length=50))
# if not postgres or you need more attributes to ingredient:
ingredients = ManyToManyField(Ingredient)
class MenuItem(models.Model):
menu_category = models.ForeignKey(MenuCategory, to_field='slug', on_delete=models.CASCADE)
name = models.CharField(max_length=30)
image = models.ImageField(upload_to='uploads/menu/')
slug = models.SlugField(null=True, blank=True, unique=True)
price = models.DecimalField(max_digits=9, decimal_places=0)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
ingredient_choices = ManyToManyField(IngredientChoiceGroup)
def __str__(self):
return self.name
此方法将允许为每个菜单项配置多个选项组,例如“面包”和“肉”。您可以通过 Django Admin 完成这一切。
您可能需要弄清楚细节。这只是一个草稿。
关于 ArrayField
的注意事项:它是数据库中的一个更简单的结构,但对于管理员,您需要通过 3rd 方库添加特定的小部件或至少编写自己的解析器。最终,M2M领域可能是更好的选择。