python - 控制 Django 继承模型中的对象创建流程

标签 python django django-models django-3.0 django-inheritance

我已经阅读了一些关于继承模型和 parent_link 的 Django 文档。 假设我有这些模型:

class Parent(models.Model):
    #Some field goes here! 
class Child(Parent):
    #Some field goes here! 

关于这个模式我有 3 个问题:

  1. 如果我想创建新的子对象并将现有父对象的 ID 传递给它,我应该怎么做?

  2. 如果我只想创建新的子对象并在一段时间后为该子对象创建父对象,我该怎么办?

  3. 此外,我不理解有关 parent_link 的文档:

    OneToOneField.parent_link

    When True and used in a model which inherits from another concrete model, indicates that this field should be used as the link back to the parent class, rather than the extra OneToOneField which would normally be implicitly created by subclassing.

感谢您的帮助!

更新问题 假设这些模型:

class User(AbsteractBaseUser):
    #Some field goes here! 

class Student(User):
    #Some field goes here! 

class Teacher(User):
    #Some field goes here! 

class Employee(User):
    #Some field goes here! 
  1. 是否可以创建Teacher 对象并为该教师放置现有User 对象的pk?

最佳答案

你不能在 Django ORM 中这样做。因为如果你想到数据库,这是可能的,但在 OOP 中,这是不可能的。所以你不应该在 Django ORM 中使用模型继承。当您使用继承时,在数据库中的子对象中创建父对象的外键,但您无法控制它。您无法在创建时更改或设置它。如果您从数据库的角度来看,当您创建子对象时,会在数据库中创建两个对象,即一个在父对象中,一个在子对象中。您应该能够为该子对象分配另一个父对象。但是当你看到OOP的观点时,根据OOP原则,当一个child被创建时,它继承了parent的所有属性,只创建一个对象。所以没有自由为这个 child 分配另一个父对象。

您可以改用抽象模型。如果您不能删除继承,那么您可以使用 RAW SQL 来完成。否则没有任何其他选择。

如果您可以删除继承,请在父级的子级中创建一个 OnetoOneField。

关于python - 控制 Django 继承模型中的对象创建流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61223580/

相关文章:

javascript - Selenium 和 Python 无法使用 .click() 单击 href ="javascript:void(0);"

Django 模型字段 getter/setter

python - django -'NoneType' 对象不可调用

python - Django manytomany 关系超过 2 个应用程序

python - Python 优化(-O 或 PYTHONOPTIMIZE)有什么作用?

python - 将两个一维数组连接成一个二维数组,并在Python中重新洗牌后再次将其打破

python - 让 Django REST Framework HyperlinkedModelSerializer 识别非默认路由

python - Django:保存相关对象后执行操作

python - 与 Django 的惰性 psql 连接

python - 下载文件时 Scrapy i/o block