CptDoraemon
V2EX  ›  程序员

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

By CptDoraemon at 2022 年 9 月 16 日 · 2609 次点击

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

有原料和食谱两个 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 年 9 月 16 日
unit 不要搞个外键吧,考虑用 choice
ikuan
   2
ikuan  
   2022 年 9 月 16 日   ❤️ 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()
metamask
   3
metamask  
   2022 年 9 月 16 日   ❤️ 1
反过来建可能会好些,从大慢慢拆小,不从小累到大,这么拆解可能些。


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

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


这里遇到问题在于,怎么把 Recipe 和 Ingredient 组装起来
这里建多一个 model 来绑定,叫 RecipeIngredient
在这里绑定后,增加需要字段,如 quantity (用 quantity 代替 amount 可能准确些),然后把单位要挪到这里也可能比较好些。
Vegetable
   4
Vegetable  
   2022 年 9 月 16 日   ❤️ 1
ingredients 放在这只能是一个 many to many ,不过这样已经无法实现你的 amount 属性了。
所以最好的办法是再增加一张表,手动管理食谱和原料的关系,后续增加其他功能也更方便
C0VN
   5
C0VN  
   2022 年 9 月 16 日
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
© 2026 V2EX · 26ms · 3.9.8.5