问题标签 [django-inheritance]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
34 浏览

python - 模板继承不起作用 - Django 教程

我正在关注Corey Schafer 的 Django 教程。我已经到了必须创建 base.html 模板继承的地方。根据我的项目调整所有内容并运行服务器后,我的网页以 html 格式的源代码呈现。点击查看服务器运行后的页面

我的views.py代码:

我的 base.html 代码:

我的 index.html 代码:

我的 Django 版本是 3.9.7。

非常感谢您的帮助。

0 投票
0 回答
22 浏览

django - Django – 将字段从子模型迁移到其父模型 – 手动迁移继承会导致“FieldError”

精简版

我正在尝试运行RunPython涉及继承模型的自定义迁移(通过),例如Restaurant。但是FieldError,在 处引发异常Restaurant.objects.all(),指定无法解析继承的字段。实际上,oddly 返回的模型apps.get_model("myapp", "Restaurant")不是从父类继承的。

更长的版本

语境

考虑一个 Django 多表继承,其中一个模型,比如Restaurant(address, serves_pizza),继承自父模型,比如Place(name)。两个模型的字段都在括号中表示。目标是将某个Restaurant字段,例如address,转移到父类Place。一项挑战是通过自定义迁移操作传输数据来保存数据。我觉得很简单的一个想法是

  1. address_place首先在 中创建一个中间字段Place
  2. 然后,手动将数据从Restaurant.addressRestaurant.address_place通过migrations.RunPython)移动
  3. 最后删除address字段并重命名address_placeaddress

着眼于 2.,下面是 by 调用的自定义代码的RunPython样子:

FieldError, 意外错误

但是,在运行相应的迁移时,FieldError会引发异常for restau in Restaurant.objects.all(),如下所示:

然而Restaurant应该可以访问父类的字段Place,即nameand address_place。事实上,如果我们检查由Restaurant返回的模型apps.get_model,我们可以看到它根本不是从父模型继承的Place,而只是从基models.Model...

因此

  • 什么可以解释这一点,即apps.get_model不保留继承?
  • 以及如何处理?或者可以使用什么其他方法来解决问题并将字段address传递给父类?

编辑——如何重现行为

我认为这种意外行为来自较旧的迁移。一个有点令人沮丧但可行的解决方案是按照@boyenec的建议清理迁移历史。

首先,我尝试在一个最小示例上重现该错误。但是一切正常:没有FieldError提出。通过检查Restaurantfrom apps.get_model("myapp", "Restaurant"),它按预期继承了 from Place。在这个最小的例子中,我直接从两个看起来像这样的模型开始:

然而,这并不能真正代表我的迁移历史。原本只有Restaurant(name, address, serves_pizza). 我创建了它的父类后验,迁移类似于这个想法。在这种情况下,我得到的错误是可重现的。

0 投票
1 回答
18 浏览

python - 如何在 Django 中维护所有代理模型的表?

我有一个模型A,并想制作它的子类。

B并且C不应该有自己的表,所以我决定proxy使用Meta. 但是,我希望有一个包含所有已实施代理的表。特别是,我想记录每个子类的名称和描述。例如,对于B,名称是"B",描述是文档字符串B。于是我又做了一个模型:

现在,我想要它,所以当我创建一个. 时A,我只能在 . 的不同子类之间进行选择A。因此,Type表应该始终是最新的。例如,如果我想对 的行为进行单元测试B,我需要使用相应的Type实例来创建 的实例B,因此Type实例已经需要在数据库中

查看Django 网站,我看到了两种方法来实现这一点:固定装置和数据迁移。夹具对于我的用例来说不够动态,因为属性实际上来自代码。这让我不得不进行数据迁移。

我试着写一个,是这样的:

问题是,我看不到如何在类中存储标识符,以便 DjangoModel实例可以恢复它。到目前为止,这是我尝试过的:

我尝试过使用相当新__init_subclass__的 Python 结构。所以我的代码现在看起来像:

但是update_or_create当数据库是新的时(例如在单元测试期间),这会失败,因为该Type表不存在。update_or_create当我在开发中遇到这个问题时(我们仍处于早期阶段,因此删除数据库仍​​然是明智的),我必须将in注释掉__init_subclass__。然后我可以迁移并将其放回原处。

当然,这个解决方案也不是很好,因为__init_subclass__运行方式超出了必要。理想情况下,这种机制只会在迁移时发生。

所以你有它!我希望问题陈述是有道理的。

感谢您阅读本文,期待收到您的来信;即使您有其他事情要做,我也祝您度过愉快的一天:)