问题标签 [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,即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). 我创建了它的父类后验,迁移类似于这个想法。在这种情况下,我得到的错误是可重现的。
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__运行方式超出了必要。理想情况下,这种机制只会在迁移时发生。
所以你有它!我希望问题陈述是有道理的。
感谢您阅读本文,期待收到您的来信;即使您有其他事情要做,我也祝您度过愉快的一天:)