django admin 中的通用多对多关系

2024-04-05

我在 Django 中有几个类似的模型:

class Material(models.Model):
    title = models.CharField(max_length=255)
    class Meta:
        abstract = True

class News(Material):
    state = models.PositiveSmallIntegerField(choices=NEWS_STATE_CHOICES)

class Article(Material):
    genre = models.ForeignKey(Genre, verbose_name='genre')

及型号Topic,与新闻和文章相关为ManyToMany。

我想使用像这样的通用多对多关系case https://stackoverflow.com/questions/933092/generic-many-to-many-relationships。但问题是如何在 django admin 中使用默认的 ManyToMany 小部件。或者另一个方便的类似物。

UPD:如果我不使用泛型,我会写

class News(Material): 
    topic = models.ManyToMany(Topic) 

class Article(Material):
    topic = models.ManyToMany(Topic)

我会得到两个相同的表来表达这些关系。我想知道是否可以使用泛型来拥有一个中间表,因为在我的数据库中不仅新闻和文章可能有主题。新闻和文章也可能与两个或多个主题相关。


编辑:看看这个http://charlesleifer.com/blog/connecting-anything-to-anything-with-django/ http://charlesleifer.com/blog/connecting-anything-to-anything-with-django/

不幸的是,GenericForeignKey 的支持不如foreignkey。有一个开放(并已接受)的票证,其中包含为他们提供小部件的补丁:http://code.djangoproject.com/ticket/9976 http://code.djangoproject.com/ticket/9976

开箱即用的是使用 GenericForeignKey 内联管理对象。

假设您的通用关系是通过以下方式实现的

from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType
from django.db import models

class News(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
    ...

and

class Topic(models.Model):
    ...
    news = generic.GenericRelation('News')   # if separate app: 'newsapp.News'

如果你想编辑某个主题的新闻,你可以为新闻定义一个内联管理:

from django.contrib.contenttypes.generic import GenericTabularInline

class NewsInline(GenericTabularInline):
    model = News

并将其添加到主题管理的内联中:

class TopicAdmin(models.ModelAdmin):
    inlines = (NewsInline, )

也就是说,从所提供的信息中我看不出您的多对多关系有什么问题。似乎表达了你所需要的。

也许您正在主题中而不是新闻和文章中定义 ManyToMany 字段?在新闻和文章中定义它们。

编辑:感谢您的澄清。您的模型设置将按照 arie 的帖子进行(即相反),并且您将进行内联编辑。如果您只想从新闻/文章/等中选择现有主题。例如,我不知道 GenericRelation 有什么开箱即用的东西(它通常只是充当反向查找助手)。你可以

a) 覆盖管理表单并根据 GenericRelation 添加带有查询集的 ModelMultipleChoiceField

b) 重写 save() 来调整关系。

工作量相当大。我个人会坚持使用多个 m2m 表,而不是将所有内容都塞到一张表中。如果您担心在请求一个或多个主题的所有新闻和文章等时数据库会进行多次查找,那么请注意,通用解决方案将始终具有与 GenericForeignKey 的要求类似的设置,即附加列型号和 ID。这可能会导致更多的查询(例如针对每个结果的 content_type)。

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

django admin 中的通用多对多关系 的相关文章

随机推荐

  • 绘制指数或分位数色带在零附近发散的栅格

    我正在使用 R 函数levelplot 来自rasterVis包来绘制具有单个发散色带的三个栅格的堆栈 我想更改栅格颜色渐变的比例 以便地图突出较低值的差异 这可以通过颜色中断的非线性分级来完成 我正在使用来自的代码a gist https
  • Orderer有区块(账本)数据吗?

    我使用基于 Kafka 的订购服务构建了超级账本结构网络 我以为Orderer没有Block数据 但是 当我检查 Orderer 服务器中的 var hyperledger product orderer chains mychannel
  • 无法加载为扩展“[extensionHere]”注册的类型[nameHere]

    我一直在 fx3 5 上使用 WCF 学习和构建 JSONP Web 服务 你可以阅读我在以下网站进行的一些试验 NET ASMX 返回纯 JSON https stackoverflow com questions 1903022 net
  • 为什么 pygame 上两个移动物体之间的碰撞不起作用?

    我正在用 pygame 做一个蛇游戏 游戏中有两条蛇 我想检测蛇头何时与另一条蛇身体碰撞 对两者都执行此操作 以及当两个头碰撞时的特殊情况 我目前正在做蛇头和另一条蛇身体之间的碰撞 如果其中一条蛇被冻结而另一条蛇在移动 则碰撞效果很好 但如
  • 如何在代码中定义DataTemplate?

    我怎样才能创建一个DataTemplate在代码中 使用 C 然后向其中添加一个控件DataTemplate
  • 当我的项目有同名模块时,如何从标准库导入? (如何控制 Python 寻找模块的位置?)

    我的项目文件夹中有一个名为calendar 在代码的其他地方 我想使用标准库Calendar班级 但是当我尝试导入此类时 使用from calendar import Calendar 这会从我自己的模块导入 从而导致稍后出现错误 我怎样才
  • PHP IMAP 交换问题

    所以我目前正在编写的 PHP 脚本有一个小问题 首先 我假设该脚本应该连接到 IMAP 邮箱 搜索一些电子邮件并下载其附件 所有这些都已经编码并正在使用我自己的 Gmail 帐户 当我尝试连接到交换服务器时出现问题 短代码摘录 mbox i
  • “自动测试/rails [...]不[...]存在。正在中止”

    我发现自动测试已停止工作 autotest loading autotest rails Autotest style autotest rails doesn t seem to exist Aborting 根据这篇博文 http ww
  • 一次保存多个 Backbone 模型

    我有一个包含大量模型的 Backbone 集合 每当在模型上设置特定属性并保存它时 就会触发大量计算并重新渲染 UI 但是 我希望能够同时在多个模型上设置属性 并且只有在全部设置完毕后才进行保存和重新渲染 当然 我不想为一项操作发出多个 h
  • Angularjs:无法将类添加到ID

    这里有点情况 我刚刚学习 Angular 但遇到了以下问题 我有一个重复自身的列表 ng repeat 当它被渲染时 您可以单击它 然后我将一个类添加到您单击的列表项中 jQuery 风格 id addClass myClass id 存储
  • 如何在php中打印多维数组

    我有一个以下格式的数组 Array 0 gt Array product id gt 33 amount gt 1 1 gt Array product id gt 34 amount gt 3 2 gt Array product id
  • 从 google firebase 存储本地缓存图像

    我正在寻找一种方法 从 google firebase 平台上的存储中缓存图像 目前 我可以下载图像并向用户显示这些图像 但即使没有互联网连接 我也无法缓存和访问该图像 数据库可以离线访问 所以我想 也应该有一种存储方式 我不想将每个图像下
  • 锁定计算机或启动另一个实例时 Visual Studio 崩溃

    当我锁定计算机或启动另一个 Visual Studio 实例时 我遇到了 Visual Studio 2013 崩溃的问题 我使用应用了最新补丁的 Visual Studio 2013 我总是以管理员身份启动 Visual Studio 这
  • kotlin 从字符串到枚举的安全转换

    我需要将字符串转换为枚举值 但想要一个在字符串不是枚举时返回 null 的函数 enum class Colors Red Green Blue 如果 testString 是值 我可以使用 Colors valueOf testStrin
  • IIS 503 通过 HTTPS“服务不可用”,HTTP 工作正常

    我有一个在 IIS 7 5 中运行的网站 当我通过 HTTP 访问该网站时 一切正常 当我通过 HTTPS 运行该网站时 我立即地收到 HTTP 503 错误 服务不可用 网站上使用的 SSL 证书是自生成 自签名的 以下是我见过的类似问题
  • 如何在 Three.js 上覆盖 HTML 文本/按钮?

    好的 很新three js在这里 但我正在努力实现谷歌所拥有的https beinternetawesome withgoogle com interland https beinternetawesome withgoogle com i
  • 如何根据 MVC 中的控制器隐藏共享布局中的元素

    我的页面主页顶部有一个引导导航栏 里面有一个文本输入 我希望它隐藏 直到执行搜索并且用户在搜索结果中看到结果results控制器 这是我的引导导航栏内
  • LogEntries 记录的 Heroku 路由器错误 H13

    我试图弄清楚我经常从 LogEntries 收到的这些错误是否值得担心 我有一个 iPhone 应用程序 可以与 heroku 上的 Rails API 进行交互 我使用 HireFire 自动增加和减少应用程序所需的测功机和工作人员的数量
  • 停止 Visual Studio 2010 在设计模式下打开 XSD

    Visual Studio 2010 现在默认在设计模式下打开 XSD 文件 我找不到任何禁用此功能的选项 有没有办法始终以文本模式打开 XSD 文件 右键单击 XSD 文件 选择 打开方式 并选择适当的选项 然后在实际打开它之前单击 设置
  • django admin 中的通用多对多关系

    我在 Django 中有几个类似的模型 class Material models Model title models CharField max length 255 class Meta abstract True class New