【问题标题】:Django model design - How to handle multiple optional attributes?Django 模型设计 - 如何处理多个可选属性?
【发布时间】:2015-05-19 22:05:33
【问题描述】:

我是 Django 的新手(但是是一位经验丰富的开发人员),我正在开始构建我的第一个 Django 项目。

这个项目非常简单:一个人们可以参加活动的网站。管理员设置体育赛事、选择日期、赛事类型(跑步、网球比赛、骑自行车)等,用户可以加入。

我的问题是事件内部可能有非常不同的数据,具体取决于他的类别。例如,如果是两人的团体网球比赛,用户应该输入他的名字和他的队友名字,他们的队名等。如果是骑自行车,他可以选择难度或容易的路线等。

我知道我可以为每种事件创建一个包含所有属性的大模型,但这是一个非常丑陋的设计......所有注册都应该有一个通用表,其中包含指向事件的链接和基本信息和公共数据(姓名、地址、电话、电子邮件等),但我不知道如何处理每个运动/事件类别的特定数据......关于如何在 Django 模型中组织这些数据的任何想法?也许添加一个简单的(key, inscription_id, type, value) 表?然后,如何渲染表单?

【问题讨论】:

    标签: python django database-design


    【解决方案1】:

    我相信你的建议叫做Entity-attribute-value模型

    http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model

    我认为将属于您的事件的所有数据保留在模型内部而不是通过相关的通用 EAV 表定义可能是一个很好的论据。

    为此,您可以使用 django 的多态库之一。我在生产中使用了django-model-utils' InheritanceManager。有很多库,包括 django-polymorphic。

    采用基于继承的方法,您可以定义单个 Event 模型或 Sport 模型。一项运动可能有名称、联赛等。所有Events 可能都有开始日期和结束日期以及运动。

    使用这种方法,您可以定义从注册到基础Event 类的外键,并使用 ORM 中内置的 djangos 来选择某些类型的所有事件或注册,而无需额外的应用程序逻辑/对象检查/属性检查采取 EAV 方法!

    【讨论】:

    • 是的,这正是我要找的!因为我是一个完整的 Django 新手,所以我不知道模型继承是可能的(据我所知,就像在 Hibernate 中一样)。很好的答案! :)
    【解决方案2】:

    您可以使用 JSON 对象或其他序列化程序将所有附加数据存储在文本字段中。

    看看django-jsonfield

    【讨论】:

    • 如何查询jsonfield中的数据?
    • 只能使用正则表达式或内置数据库功能来解析 json(如果有)。但是,如果您不必通过该数据进行查询,只需显示它,您就可以使用它。
    • 正如 dm03514 所说,在 JSON 字段中添加所有数据会限制数据库的功能,例如搜索所有想在草地上打网球的注册用户(例如)......无论如何,谢谢你的回答! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2016-10-12
    • 2021-06-11
    • 1970-01-01
    • 2016-11-24
    • 2017-11-08
    • 2020-11-26
    相关资源
    最近更新 更多