Django - 向用户询问每个菜单项的菜单项选择

时间:2020-12-30 09:12:12

标签: python mysql django

我正在 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

2 个答案:

答案 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领域可能是更好的选择。

相关问题