我正在Django 4中开发一个食物食谱数据库Web应用程序,我想在给定的模型中存储食谱所需的未知数量的配料.配料由名称、体积和测量单位描述-例如:糖400克、鸡蛋2片等.

在保留查询数据或对配料体积进行算术运算的能力的同时,将此类数据存储在给定模型中的最佳实践是什么?

到目前为止,我已经找到了两种 Select ,但由于我对Web开发非常陌生,我不知道它们是否可行:

  1. 为配料创建单独的模型并使用多对多关系来连接模型,但这将 for each 实例创建一个新对象,例如体积不同
  2. 只需使用TextField(),然后使用一些疯狂的正则表达式来分离成分

考虑到我是网络开发的新手,我不知道什么是最合适的 Select .

谢谢

推荐答案

  1. 为配料创建单独的模型,并使用多对多关系...

当您想要根据食谱的成分来筛选食谱时,多对多关系非常有用.例如,列出所有含有鸡蛋或糖的食谱.

如果您想要此功能,则必须使用多对多字段.

...但这将 for each 实例创建一个新对象,例如卷不同

多对多字段支持through参数,这允许您传递一个中间模型来保存额外数据以避免此问题.请参见文档中的Extra fields on many-to-many relationships.


  1. 只需使用TextField(),然后使用一些疯狂的正则表达式来分离成分

如果你不想按配料过滤,使用JSONField比使用ManyToManyFieldTextField更好的 Select .这将允许您以 struct 化格式存储数据,例如:

ingredients = [
    {'name': 'Sugar', 'qty': '400 grams'},
    {'name': 'Egg', 'qty': '1'},
    ...
]

附注:如果您打算使用JSONField,还可以看看我创建的一个名为django-jsonform的库,它对于在管理员中创建用户友好的JSON编辑表单很有用.

Django相关问答推荐

构造一个定制字符串(实体、年份和字母数字的组合)作为Django中的Postgres数据库的主键是否明智?

根据当前对象中的多对多字段过滤对象

NoneType对象没有属性保存Django

Django获取具有值的相关对象的计数并将其添加到注释中

如何在 django 中修改现有模型实例?

如何根据查询集中的条件返回多个聚合?

Django 独立脚本

变量为无时默认模板标签输出的Django设置?

如何在 forms.Form 子类上动态设置 models.ModelChoiceField 的查询集

Django 模型将外键设置为另一个模型的字段

在 Django 过滤器语句中,__exact 和等号 (=) 有什么区别?

Django UrlResolver,在运行时添加 url 进行测试

Django - 无法为具有动态 upload_to 值的 ImageField 创建迁移

Django:如何在视图中获取格式日期?

Django 不调用模型清理方法

django 管理列表中的外键显示

将属性添加到 Django 模型的 Meta 类中

警告:找不到分发的 svn 位置==0.6.16dev-r0

如何在 Python 中运行另一个脚本而不等待它完成?

Django 在 css 文件中使用背景图像的方法