问题标签 [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.
python - 模板继承不起作用 - Django 教程
我正在关注Corey Schafer 的 Django 教程。我已经到了必须创建 base.html 模板继承的地方。根据我的项目调整所有内容并运行服务器后,我的网页以 html 格式的源代码呈现。点击查看服务器运行后的页面。
我的views.py代码:
我的 base.html 代码:
我的 index.html 代码:
我的 Django 版本是 3.9.7。
非常感谢您的帮助。
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
。一项挑战是通过自定义迁移操作传输数据来保存数据。我觉得很简单的一个想法是
address_place
首先在 中创建一个中间字段Place
,- 然后,手动将数据从
Restaurant.address
(Restaurant.address_place
通过migrations.RunPython
)移动 - 最后删除
address
字段并重命名address_place
为address
着眼于 2.,下面是 by 调用的自定义代码的RunPython
样子:
FieldError
, 意外错误
但是,在运行相应的迁移时,FieldError
会引发异常for restau in Restaurant.objects.all()
,如下所示:
然而Restaurant
应该可以访问父类的字段Place
,即name
and address_place
。事实上,如果我们检查由Restaurant
返回的模型apps.get_model
,我们可以看到它根本不是从父模型继承的Place
,而只是从基models.Model
...
因此
- 什么可以解释这一点,即
apps.get_model
不保留继承? - 以及如何处理?或者可以使用什么其他方法来解决问题并将字段
address
传递给父类?
编辑——如何重现行为
我认为这种意外行为来自较旧的迁移。一个有点令人沮丧但可行的解决方案是按照@boyenec的建议清理迁移历史。
首先,我尝试在一个最小示例上重现该错误。但是一切正常:没有FieldError
提出。通过检查Restaurant
from apps.get_model("myapp", "Restaurant")
,它按预期继承了 from Place
。在这个最小的例子中,我直接从两个看起来像这样的模型开始:
然而,这并不能真正代表我的迁移历史。原本只有Restaurant(name, address, serves_pizza)
. 我创建了它的父类后验,迁移类似于这个想法。在这种情况下,我得到的错误是可重现的。
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__
运行方式超出了必要。理想情况下,这种机制只会在迁移时发生。
所以你有它!我希望问题陈述是有道理的。
感谢您阅读本文,期待收到您的来信;即使您有其他事情要做,我也祝您度过愉快的一天:)