V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
CptDoraemon
V2EX  ›  程序员

老哥们,请问这个 Model 在 Django 里面怎么建比较好

  •  
  •   CptDoraemon · 2022-09-16 07:01:41 +08:00 · 1376 次点击
    这是一个创建于 791 天前的主题,其中的信息可能已经有所发展或是发生改变。

    新手上路,如果问题太简单请见谅

    有原料和食谱两个 Model ,原料组成食谱。

    class Ingredient(models.Model):
        name = models.CharField(max_length=200)
        unit = models.ManyToManyField('IngredientUnit') ## unit 后期可能会增删
    
    
    class IngredientUnit(models.Model):
        name = models.CharField(max_length=200)
    
    
    class Recipe(models.Model):
        name = models.CharField(max_length=200)
        ingredients = ??
    

    比方说有

    原料 1: {
        name: '酱油',
        unit: ['瓶', '桶']
    }
    原料 2: {
        name: '八角',
        unit: ['粒']
    }
    
    食谱: {
        name: '烧鸡',
        ingredients: [
            {
                name: '酱油',
                unit: '瓶',
                amount: 1
            },
            {
                name: '酱油',
                unit: '桶',
                amount: 2
            } // 酱油两桶不够,三桶太多
        ] // 不可以出现“一粒酱油”的组合
    }
    
    5 条回复    2022-09-16 20:57:15 +08:00
    johnman
        1
    johnman  
       2022-09-16 09:00:31 +08:00
    unit 不要搞个外键吧,考虑用 choice
    ikuan
        2
    ikuan  
       2022-09-16 09:18:17 +08:00   ❤️ 1
    如果我没理解错意思的话 或许可以这样
    class Ingredient(models.Model):
    name = models.CharField(max_length=200)
    unit = models.ManyToManyField('IngredientUnit') ## unit 后期可能会增删


    class IngredientUnit(models.Model):
    name = models.CharField(max_length=200)

    class Recipe(models.Model):
    name = models.CharField(max_length=200)
    ingredients = models.ManyToManyField('Ingredient',through='recipe_ingredient',)

    class recipe_ingredient(models.Model):
    recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE)
    ingredient = models.ForeignKey(Ingredient, on_delete=models.CASCADE)
    quantity = models.IntegerField()
    freakxx
        3
    freakxx  
       2022-09-16 11:22:19 +08:00   ❤️ 1
    反过来建可能会好些,从大慢慢拆小,不从小累到大,这么拆解可能些。


    你先把建 Recipe 建了,然后再建 Ingredient , 这两者做个 m2m 关系。

    至于原料单位用 choice 还是 model ,这个看需求,做成 model 后面扩展也好。


    这里遇到问题在于,怎么把 Recipe 和 Ingredient 组装起来
    这里建多一个 model 来绑定,叫 RecipeIngredient
    在这里绑定后,增加需要字段,如 quantity (用 quantity 代替 amount 可能准确些),然后把单位要挪到这里也可能比较好些。
    Vegetable
        4
    Vegetable  
       2022-09-16 11:30:35 +08:00   ❤️ 1
    ingredients 放在这只能是一个 many to many ,不过这样已经无法实现你的 amount 属性了。
    所以最好的办法是再增加一张表,手动管理食谱和原料的关系,后续增加其他功能也更方便
    xavierskip
        5
    xavierskip  
       2022-09-16 20:57:15 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2769 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 12:01 · PVG 20:01 · LAX 04:01 · JFK 07:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.