【问题标题】:Django - ask user for menuitem choices on each menu itemDjango - 向用户询问每个菜单项的菜单项选择
【发布时间】:2020-12-30 18:02:21
【问题描述】:

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

这就是问题所在: 例如,我有一个 menuItem "MEXICAN BURGER" 我想询问用户他们选择的肉......即鸡肉或牛肉,或者他们选择的面包,白色或棕色,

或者我可能有一个 MenuItem “OMELETTE COMBO”,我想询问用户他们想要的煎蛋类型,例如(“西班牙煎蛋”、“菠菜和蘑菇煎蛋”)

或者我可能有一个菜单项“ESPRESSO”,我希望他们在('single','double')之间进行选择

*一个菜单项可以有多个与之相关的选择,即汉堡项可以选择面包和肉类 为了更好地了解我的问题,请访问此 link * 还有这个another link

【问题讨论】:

    标签: python mysql django


    【解决方案1】:

    对此有不同的解决方案。

    基于代码:继承

    您为每个选择类型和子类 MenuItem 以及这些 mixins 创建 Mixins。

    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
    

    每当向菜单中添加更多选项或更改菜单时,这将需要更改代码。

    基于数据:通用模型

    要允许管理员用户通过 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:它在数据库中是一个更简单的结构,但对于管理员,您需要通过第三方库添加特定的小部件,或者至少编写自己的解析器。最后,M2M 领域可能是更好的选择。

    【讨论】:

    • mixins 是如何工作的?因为记住它必须是动态的。管理员用户应该能够添加这些选择,例如汉堡的选择.. 将是面包的选择和肉类的选择.. 管理员应该能够向菜单项添加任何其他选择,并且将要求用户提供它
    • 您能否详细解释一下“通用模型”
    • 以便更好地理解问题。请访问此链接cafejavas.co.ug/user/productDetails/…
    • 如果您需要管理员添加选项,那么您无法使其与 Mixins 一起使用。你应该在你的问题中这么说。 “通用模型”只是我选择命名通用解决方案的一个术语。 “通用”意味着它是一种通用的、可扩展的解决方案。
    • 你能看看我发给你的那些链接吗?
    【解决方案2】:

    您可以根据需要创建另一个模型,例如MeatOption 并添加一个 ForeignKey 到 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
    

    理想情况下,您应该考虑对项目进行分类并将该分类反映到您的模型中。即你可以有汉堡类、饮料类等等,这样你就只包括相关的选项。

    如果所有这些类别之间有共同的功能,您可以从 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)
    

    细节当然取决于你的用例

    【讨论】:

    • 你说“分类到你的模型中。即你可以有汉堡类,饮料类”但这不是一个解决方案,因为我希望它是动态的。即系统管理员应该能够添加这些选项,因此可以询问用户他们的选择
    猜你喜欢
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 2011-11-16
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    相关资源
    最近更新 更多