- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
(Django 1.x,Python 2.6.x)
我有以下模型:
class Animal(models.Model):
pass
class Cat(Animal):
def __unicode__(self):
return "This is a cat"
class Dog(Animal):
def __unicode__(self):
return "This is a dog"
class AnimalHome(models.Model):
animal = models.ForeignKey(Animal)
我没有实例化任何动物,因为这应该是一个虚拟类。我已经实例化了猫和狗,但在 AnimalHome 的管理页面中,我对动物的选择显示为“动物对象”(我猜是默认的 __unicode__()),而不是我为两个子类定义的 __unicode__。帮助。
我认为抽象基类问题对于这个问题来说是一个转移注意力的问题。即使 Animal 不应该是抽象的,我仍然有一个问题,由于某种原因,由于 ForeignKey 是在 Animal 而不是它的子类之一上定义的,所以调用父类(super class)方法而不是子类。在 OO 编程中,当您调用 object.method() 时,您应该获得最低子类的实现,并且您必须做额外的工作才能获得任何父类(super class)的实现。那么,为什么在子类上定义 __unicode__ 还不够——实际上问题可能是 __unicode__ 根本没有被调用,因为对 Animal 类的自省(introspection)表明它没有定义。所以也许如果我为 Animal 定义 __unicode__ 并让它调用子类的 __unicode__ 我可以获得预期的效果。
好的,我想我理解了 ORM 问题。这两个答案都帮助我理解了这一点,谢谢。在对此进行试验时,我发现当 Django 保存子类模型时,它会做两件事:(1) 它在父类(super class)的表中为子类对象创建一行,以及 (2) 它使子类表中的 PK 与在父类(super class)表中分配的 PK。子类表中的这个 PK 被命名为 superclass_ptr。基于此,我炮制了以下内容。我很感激反馈。
Class Animal(models.Model)
def __unicode__(self):
if Dog.objects.filter(pk=self.pk).count() > 0:
return unicode(Dog.objects.get(pk=self.pk))
elif Cat.objects.filter(pk=self.pk).count() > 0:
return unicode(Cat.objects.get(pk=self.pk))
else:
return "An Animal!"
Lawrence 似乎对这个问题最中肯。 Cat 和 Dog 将有不相交的 PK 集(Animal 的任何子类都将具有与其父类(super class)的记录相同的 PK),但不幸的是 Django 没有在幕后执行任何工作:“我是动物。我知道动物有狗和猫的子类。具体来说,我是 3 号动物,而且我刚刚检查了一下,还有一只 3 号猫。这意味着我实际上是 3 号猫。”即使使用 Python 的自省(introspection),这看起来完全可能且非常合理(因为猫不会做任何动物不能做的事情)。谢谢大家。
最佳答案
ForeignKey(Animal) 就是对 Animal 表中一行的外键引用。底层 SQL 架构中没有任何内容表明该表正被用作父类(super class),因此您会得到一个 Animal 对象。
要解决此问题:
首先,您希望基类是非抽象的。无论如何,这对于 ForeignKey 都是必要的,并且还确保 Dog 和 Cat 将具有分离的主键集。
现在,Django 使用 OneToOneField 实现继承。正因为如此,具有子类实例的基类实例获得对该实例的引用,并适本地命名。这意味着您可以:
class Animal(models.Model):
def __unicode__(self):
if hasattr(self, 'dog'):
return self.dog.__unicode__()
elif hasattr(self, 'cat'):
return self.cat.__unicode__()
else:
return 'Animal'
这也回答了您向 Ber 提出的有关依赖于其他子类属性的 unicode() 的问题。您现在实际上是在子类实例上调用适当的方法。
现在,这确实表明,由于 Django 已经在幕后寻找子类实例,因此代码可以直接返回 Cat 或 Dog 实例而不是 Animal。您将不得不与开发人员讨论这个问题。 :)
关于python - Django 管理界面不使用子类的 __unicode__(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/313054/
我是一家小型非营利组织的技术总监,我们正在制作一个新网站。我们提出了几个不同主页设计的模型,需要接收董事会成员的意见。是否有在线应用程序/程序/框架可以接收和组织用户评论?我正在寻找允许在查看页面时发
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我阅读了很多关于 java 接口(interface)的文章。我知道你可以实现多态性和其他伟大的东西(函数指针等)。我有理论知识,但有一点点或什至没有。我一直在使用很多已经制作好的界面,比如“Runn
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我正在尝试在 Windows 7 上编写一个 python 脚本来与我的 Wacom Bamboo Pen 数位板交互。 Wacom 建议使用 WinTab API,它工作正常,但不适用于我的应用程序
我正在研究一种远程访问有关 Linux 服务器统计信息的方法,即 conky会显示。 有没有办法与 conky 交互并获取它显示的统计信息?如果没有,您能否推荐一种获取此类统计数据的好方法? (C/C
将所有这些代码包装在 UI: do { } block 中的原因是什么?我在哪里可以获得关于它的明确说明? UI: do { backgroundButton.setImage(UIImage
我需要将 R 连接到某些 C# 应用程序。我安装了 rscproxy_1.3 和 R_Scilab_DCOM3.0-1B5 添加了对 STATCONNECTORCLNTLib、StatConnecto
我正在尝试遍历接口(interface)片段以通过 id 查找我的特定结构并更改属性。 type A struct { ID ID Steps []Step } type Ste
我有两种不同格式的相同界面,一种是键由低破折号分隔的 JSON 格式,另一种是 javascript camelCase 格式: JSON 格式: interface MyJsonInterface
操作系统:Linux。 我正在尝试寻找可能的方法来为我的嵌入式系统实现 Web 界面。 目前有一个外壳(基于文本)和一小组命令用于查询设备。 我是网络开发新手,我的问题是: 我必须使用什么网络服务器?
我正在尝试运行基于 Mechanical Turk Qualtrics 的调查,并且需要一些似乎可以通过 Mechanical Turk API 使用的功能,例如 custom Qualificati
我见过漂亮的 MetroTwit 界面 http://www.metrotwit.com/ ;我想知道使用了哪些 WPF 组件来尝试重现它。 最佳答案 MetroTwit 设计师在这里:) 所有的控件
我有一个小问题。我需要将 Hadoop Web 界面与我们的 Web 应用程序集成。我只需要一个 Hadoop 接口(interface),我们可以在其中运行一些 hadoop 命令,例如 1
假设我有这个 JavaScript 函数: function updateMainBuff(buff) { // do some stuff } 我的
我试图找出一个窗口是否属于当前的虚拟桌面。 我从 winapi 中找到了 VirtualDesktopManager 类,但即使根据 here 它应该位于“shobjidl.h” header 中,当
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它. 8年前关闭。 Improve this
我的 Tkinter GUI 界面有问题。文本不会在 shell 中打印,但如果将 Entry 放置在第一个 tk 窗口 get() 中,它就可以工作...帮助我吗? 这是我的代码: import o
我有一个在 MATLAB 中实现的随机微分方程组。只有 4 个变量与 Euler-Maruyama 集成,所以没有什么太花哨的......不过,技术细节对于这个问题并不重要。 您建议我如何构建一个 W
对于我创建的插件,我想添加一个网络界面,您可以从中更改设置并执行一些简单的数据操作。此数据操作应通过 sqlquerys 完成。我正在使用 sqlite 数据库,这就是问题开始的地方: 网站(serv
我是一名优秀的程序员,十分优秀!