Django - 多态模型还是一个大模型?

2024-03-04

我目前正在 Django 中开发一个模型,其中一个模型可以具有多种不同的特征,具体取决于它是什么类型的对象。因此,假设我们有一个名为哺乳动物的模型,它可以是大象或海豚(分别具有自己的特征“tusk_length”和“flipper_length”)。

基本的 OOP 原则高喊“多态性”,我倾向于同意。但是,由于我是 Django 的新手,我首先想知道这是否是在 Django 中执行此操作的最佳方法。我听说过很多例子,有些人对单一巨型模型表现出了自己的偏好

我已经尝试使用 GenericForeignKeys,如下所述:如何将 Django 的 GenericForeignKey 限制为模型列表? https://stackoverflow.com/questions/6335986/how-can-i-restrict-djangos-genericforeignkey-to-a-list-of-models。虽然这个解决方案工作得很好,但我不喜欢无法过滤,而且这种关系只是一种方式。也就是说,虽然您可以从 Mammal 对象获取 Dolphin,但无法从 Dolphin 获取 Mammal 对象。

所以,这是我的两个选择:

选择A:

from django.db import models
class Mammal(models.Model):
    hair_length = models.IntegerField()
    tusk_length = models.IntegerField()
    flipper_length = models.IntegerField()
    animal_type = models.CharField(max_length = 15, choices = ["Elephant", "Dolphin"]

选项B:

from django.db import models
class Mammal(models.Model):
    hair_length = models.IntegerField()

class Elephant(Mammal):
    tusk_length = models.IntegerField()

class Dolphin(Mammal):
    flipper_length = models.IntegerField()

据我了解,选择 B 在查询和列出所有大象或海豚时具有更好的代码优势。然而,我注意到,如果不将animal_type放入类中,从哺乳动物列表中获取所有大象(是否有查询?)并不那么简单,默认情况下依赖于类。

这导致了我在多态性方面看到的另一个问题,这个问题不会出现在上面的示例或我的应用程序中,但值得一提的是,在不完全删除海豚的情况下将海豚对象编辑为大象是很困难的。

总的来说,有什么普遍的偏好,或者有什么我不应该使用多态性的重要原因吗?


一般来说,对于数据库设计,我的建议是避免继承。它使访问和更新变得复杂。

在 Django 中,尝试为您的基本模型使用抽象类。这意味着不会为其创建数据库表。它的字段/列将在其子模型中自动创建。好处是:Django/Python 代码中的代码重用以及数据库中的简单、扁平化设计。代价是:管理/查询子模型的混合集合需要更多工作。

请参阅此处的示例:Django 模式:模型继承 http://charlesleifer.com/blog/django-patterns-model-inheritance/

或者,您可以将“哺乳动物”的概念更改为“哺乳动物特征”。并在每个特定的哺乳动物类中包含一个 MammalTraits 对象。在代码中,这就是组合(has-a)。在数据库中,这将表示为外键。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django - 多态模型还是一个大模型? 的相关文章

随机推荐

  • 强制 R 不使用指数表示法(例如 e+10)?

    我可以强制 R 使用常规数字而不是使用e 10 类似符号 我有 1 810032e 09 and 4 在同一向量内并希望看到 1810032000 and 4 我正在为老式程序创建输出 我必须使用编写一个文本文件cat 到目前为止效果很好
  • java: Spring:如何将 bean 从一个 ClassPathXMLApplicationContext 传输到另一个?

    如何从一个豆子转移豆子ClassPathXMLApplicationContext到另一个 我创建一个这样的上下文 ClassPathXMLApplicationContext myOneContext new ClassPathXMLAp
  • 可展开列表视图自动折叠

    我无法在扩展新组时关闭之前扩展的组 我读过类似的问题 但我无法从中提取概念 我尝试使用 crashGroup groupPosition 方法 但它不起作用 您好 请尝试下面的代码 int lastExpandedGroupPosition
  • 关闭亮点

    我想关闭 PHPStorm 对非错误相关事物的烦人的突出显示 我读了他们的文档 其中说要转到首选项 gt 编辑器 gt 检查 我取消了 SQL 的所有选择 但我仍然无缘无故地得到绿色突出显示 我如何禁用此功能 这很让人分心 That s 语
  • 使用反射实例化内部类时出现 InstantiationException。为什么?

    我无法创建 B 对象 但为什么呢 public class AFactory public int currentRange private abstract class A protected final Object range cur
  • 线程 C++ 的瓶颈

    所以我只是想验证一下我的理解 希望你们能够消除任何误解 所以本质上我有两个线程使用相同的锁并在持有锁时执行计算 但有趣的是 在锁内我将导致线程休眠一小段时间 对于两个线程 每个线程的睡眠时间都会略有不同 由于锁的工作方式 较快的线程是否会因
  • 运行 GAE 开发服务器时,本地 MySQLdb 连接失败,并出现 paramstyle 的 AttributeError

    我正在使用 Flask Alchemy 针对 Cloud SQL 构建 GAE Flask 应用程序 并运行dev appserver在构建应用程序时对其进行测试 但是 如果我设置SQLALCHEMY DATABASE URI to a m
  • 通过蓝牙进行多点连接?

    我开始做广告 开始浏览 什么时候在同一个WiFi下 它可以工作 但是当我关闭 WiFi 时只留下蓝牙 甚至也不 void browser MCNearbyServiceBrowser browser foundPeer MCPeerID p
  • 如何使用 Google Drive API 将文件传输到其他用户的云端硬盘?

    我正在尝试转移当前属于我的 Google 文档 并将其移至另一个用户的 Google 云端硬盘的根目录 两个帐户都位于同一域中 我使用服务帐户来访问所有用户 起初我尝试通过修改权限来做到这一点 这将使第二个用户能够访问该文件 但不会将其放入
  • 如何使用“Matlab Data / Engine API for c++”在 C++ 中加载 .mat

    我正在尝试在 C 程序中包含 mat 然而 我无法使用传统的 mat h 由于 Matlab API for C 之间的内部兼容性问题 https de mathworks com help matlab matlab c api to r
  • 如何迭代 JavaScript 对象的属性名称?

    我想从 JavaScript 对象获取属性名称以动态构建表 例如 var obj fname joe lname smith number 34 for var i 0 i lt obj properties length i alert
  • 获取 std::list<>::iterator 的值到指针?

    我如何循环遍历 stl List 并存储其中一个对象的值以供稍后在函数中使用 Particle closestParticle for list
  • 从 php 调用 swi-prolog

    我正在尝试从 php 脚本中调用 swi prolog 例如 exec start plwin exe f C path load pl g run from file os1 print r os1 我可以看到 prolog 窗口打开并遵
  • 禁止 JavaScript/HTM 页面中的 ADO 安全警告

    我有一个功能齐全的网站存储在网络驱动器上 还有一个充当该网站数据库的 Access 数据库 由于缺乏服务器端代码 我被迫使用 JavaScript 创建 ADO ActiveX 对象来连接到数据库 这有效 我遇到的问题是 每当用户打开该站点
  • python 中的类的 Lambda 函数?

    一定有一种简单的方法可以做到这一点 但不知何故我可以解决它 我描述我想要的最好的方法是类的 lambda 函数 我有一个库需要一个类的未实例化版本作为参数来使用 然后它实例化该类本身以进行处理 问题是我希望能够动态创建该类的版本 以传递给库
  • 警告:preg_match() [function.preg-match]:编译失败:在偏移处没有可重复的内容

    我正在尝试将 preg match 检查从 url 检查更改为用户名检查 最小 最大 2 16 个字符 破折号 空格和连字符可以接受 我收到这个错误 Warning preg match function preg match 编译失败 在
  • 拦截Ajax请求?

    我试图拦截所有用普通 JavaScript 发出的 AJAX 请求 但我在 Stack Overflow 上发现的内容似乎不起作用 最简单的 我会说 功能性 代码如下 function open XMLHttpRequest prototy
  • 将自定义组件添加到 intelliJ 中的 FXML 场景构建器

    我想将自定义组件 自定义组件添加到 intelliJ 中的 javafx 场景生成器中 我目前使用的是java 8 1 我听说 java 10 可以向场景构建器添加组件 因为它有 java 2 0 我安装了java 10 但我不知道如何切换
  • 如果服务器端已有数据,则阻止 componentDidMount 获取数据

    ComponentDidMount 在组件安装时触发 包括在服务器端渲染后进行水合时 我在网上找到的解决方案之一是检查该州是否有数据 然而 这需要在每个组件上包含大量代码 还有哪些其他解决方案 componentDidMount if re
  • Django - 多态模型还是一个大模型?

    我目前正在 Django 中开发一个模型 其中一个模型可以具有多种不同的特征 具体取决于它是什么类型的对象 因此 假设我们有一个名为哺乳动物的模型 它可以是大象或海豚 分别具有自己的特征 tusk length 和 flipper leng