- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了类似的问题 How to query abstract-class-based objects in Django?该线程建议使用 multi_table_inheritance。我个人认为使用 content_type 在概念上更舒服(只是感觉更接近逻辑,至少对我来说)
使用上一个链接中的示例,我只需添加一个 StelarType 作为
class StellarType(models.Model):
"""
Use ContentType so we have a single access to all types
"""
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
然后将其添加到抽象基础模型
class StellarObject(BaseModel):
title = models.CharField(max_length=255)
description = models.TextField()
slug = models.SlugField(blank=True, null=True)
stellartype = generic.GenericForeignKey(StellarType)
class Meta:
abstract = True
为了在 StellarObject 和 StellarType 之间进行同步,我们可以在每次创建 Planet 或 Star 时连接 post_save 信号来创建 StellarType 实例。这样我就可以通过StellarType查询StellarObjects了。所以我想知道使用这种方法相对于使用 multi_table_inheritance 的优点和缺点是什么?我认为两者都在数据库中创建了一个附加表。但是数据库性能如何呢?可用性/灵 active 怎么样?感谢您的任何意见!
最佳答案
对我来说,当您想要将一个对象与许多本质上不属于同一“类型”的模型之一关联时,ContentType 是一种可行的方法。就像您希望能够在社交网络上对用户、页面和图片添加评论一样,但这三个模型没有共享合理的父类(super class)型。当然,您可以创建一个“可评论”父类(super class)型,但对我来说,这感觉更像是一个 mixin,而不是这三个事物派生的基本类型。在 ContentType 出现之前,您别无选择,只能为这些类型的关系发明父类(super class)型,如果您需要在同一个应用程序中多次执行此操作(假设您还有事件、警报、消息等,每个都可以应用于不同的模型集)。
当您想要将属性附加到基本模型时,多表继承最有意义,这样它们将在从其扩展的所有具体模型中共享,以便您可以获得多态行为。 Commentable 并不真正适合这种模式,因为所有这些行为都可以放在 Comment 模型上,而不是放在 Commentable 对象上。但是,如果您有不同类别的用户,它们具有许多相同的行为并且应该是可聚合的,那么它就更有意义了。
对我来说,多表继承的主要优点是更清晰的数据模型,具有可以在Python端利用的隐式关系和继承(尽管多态性仍然有点困惑,如 here 和 here 所示)。 ContentType 的主要优点是它更通用,并且将辅助功能保留在模型之外,但代价是稍微不那么原始的模式(模型上有很多“元”字段来定义这些关系)。对于您的示例,您仍然必须依赖 post_save
,这对我来说似乎也不必要地困惑/神奇。
关于Django:使用 ContentType 与 multi_table_inheritance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12782847/
我正在尝试将一些模型从一个 Django 应用程序迁移到另一个应用程序,并基于这个问题 How do I migrate a model out of one django app and into
我正在开发我的 android 项目,我正在创建一个请求函数来上传文件,该请求如下所示, httpClient.put(uri) { body = MultiPartFormDataConte
我正在尝试学习如何使用 ContentTypes 框架,我似乎无法找到我自己的应用程序。 文档 have clear instructions用于从 django.contrib.sites 导入模型
我最近尝试将一些装置加载到我的数据库中。当我运行服务器并加载各种页面时,虽然出现错误: Caught DoesNotExist while rendering: ContentType matchin
我用 async await 写了一些简单的代码,但是当我尝试运行它时,编译器抛出一个 System.InvalidOperationException。 完整的错误信息是: Unhandled Ex
微软有篇文章:http://support.microsoft.com/kb/193998/zh-cn,用doc读取和显示二进制数据,《怎样读取二进制文件》,没测试,懒得编译dll &nb
本文整理了Java中okreplay.YamlRecordedResponse.contentType()方法的一些代码示例,展示了YamlRecordedResponse.contentType()
写在前边 最近在写 OAuth2 对接的代码,由于授权服务器(竹云BambooCloud IAM)部署在甲方内网,所以想着自己 Mock 一下授权方的返回体,验证一下我的代码。我这才踩到了坑…… 故事
我的数据迁移文件中有这个: def set_target_user(apps, schema_editor): LogEntry = apps.get_model('auditlog', 'L
如何在 Django 单元测试中使用 GenericRelations? 我在互联网上阅读并尝试了无数建议,但无济于事。 这个很有前途Problems with contenttypes when l
我正在设计一个 api,它返回一个从第三方服务获取的图像 url。 我的问题是,对于所有媒体,我都使用我所谓的“媒体对象” { "ConetetType": "image/jpeg", "href
我有这些模型: class App(models.Model): name = models.CharField(max_length=100) class ProjectA(models.Mod
什么时候创建新的 ContentType?我如何自己触发它? 我进行了大量迁移、创建新模型等。完成所有操作后,将进行最终的数据迁移,将这些新对象的权限分配给已拥有相关权限的任何组。 (特此“相关权限”
在我们基于 ASP.NET Core 的 Web 应用程序中,我们需要以下内容:某些请求的文件类型应获得自定义 ContentType 的响应。例如。 .map应映射到 application/jso
我正在使用 Apache 和 mod_wsgi 将 Django 1.10 项目部署到 Ubuntu 服务器上。我收到以下无法解决的 500 错误: RuntimeError: Model class
我有两个表,Content 和 ContentType 每个内容都有一种内容类型 每种内容类型可能包含在许多内容中。 这是我的模型: @Entity @Table(name = "content")
我正在尝试使以下内容适合 Django ORM。有一个 Publish 模型来管理不同类型内容的发布(其他模型)。这样我就可以轻松地执行 Publish.objects.all() 并按日期排序。我做
我想从 ContentType 实例中获取对象的查询集,然后能够过滤它们。从文档中,可以到 get()一个对象使用: ct.get_object_for_this_type(**kwargs) 如何制
假设这是用户照片的模型: class Photo(models.Model): user = models.ForeignKey(User) title = models.CharFi
This web page有一个 ASP.NET MVC 代码示例,其中包括以下行: [Route("sitemap.xml")] public ActionResult SitemapXml() {
我是一名优秀的程序员,十分优秀!