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

2022-09-16 07:01:41 +08:00
 CptDoraemon

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

有原料和食谱两个 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
        } // 酱油两桶不够,三桶太多
    ] // 不可以出现“一粒酱油”的组合
}
1207 次点击
所在节点    程序员
5 条回复
johnman
2022-09-16 09:00:31 +08:00
unit 不要搞个外键吧,考虑用 choice
ikuan
2022-09-16 09:18:17 +08:00
如果我没理解错意思的话 或许可以这样
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
2022-09-16 11:22:19 +08:00
反过来建可能会好些,从大慢慢拆小,不从小累到大,这么拆解可能些。


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

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


这里遇到问题在于,怎么把 Recipe 和 Ingredient 组装起来
这里建多一个 model 来绑定,叫 RecipeIngredient
在这里绑定后,增加需要字段,如 quantity (用 quantity 代替 amount 可能准确些),然后把单位要挪到这里也可能比较好些。
Vegetable
2022-09-16 11:30:35 +08:00
ingredients 放在这只能是一个 many to many ,不过这样已经无法实现你的 amount 属性了。
所以最好的办法是再增加一张表,手动管理食谱和原料的关系,后续增加其他功能也更方便
xavierskip
2022-09-16 20:57:15 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/880418

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX