Django:两个不同的子类指向同一个父类

Furbeenator

我有一个模型Person,可以存储有关人的所有数据。我也有一个Client扩展Person模型。我还有另一个扩展模型OtherPerson,它也扩展了Person模型。我想创建一个指向a的客户Person,并且还创建一条指向该客户OtherPerson记录Person基本上,我希望将一个Person对象视作aClient和and an OtherPerson,具体取决于当前视图。Django的ORM是否可以做到这一点,或者我是否需要以某种方式编写Raw查询来创建这种情况。我从数据库方面肯定是有可能的,因为两个子类都将使用其person_ptr_id字段指向父Person类。

简而言之,如果我创建了一个Client(并因此创建了Person),我是否也可以OtherPerson使用中的基数Person创建对象Client这样,我可以将它们视为ClientOR或OR OtherPerson,保存一个将影响Person每个OR字段?

“水平”多态性?

这是我的模型的简化版本,以防万一:

class Person(models.Model):
    """
        Any person in the system will have a standard set of details, fingerprint hit details, some clearances and items due, like TB Test.
    """
    first_name = models.CharField(db_index=True, max_length=64, null=True, blank=True, help_text="First Name.")
    middle_name = models.CharField(db_index=True, max_length=32, null=True, blank=True, help_text="Middle Name.")
    last_name = models.CharField(db_index=True, max_length=64, null=True, blank=True, help_text="Last Name.")
    alias = models.CharField(db_index=True, max_length=128, null=True, blank=True, help_text="Aliases.")
    .
    .
    <some person methods like getPrintName, getAge, etc.>

class Client(Person):
    date_of_first_contact = models.DateField(null=True, blank=True)
    .
    .
    <some client methods>


class OtherPerson(Person):
    active_date = models.DateField(null=True, blank=True)
    termination_date = models.DateField(null=True, blank=True)
    .
    .
    <some other person methods>
Furbeenator

好的,我不想回答自己的问题,特别是因为它是(Django模型继承:创建现有实例的子实例(向下转换?)的重复

@丹尼尔·罗斯曼(Daniel Roseman)再次让我摆脱了困境。要爱那个家伙!

person = Person.objects.get(id=<my_person_id>)
client = Client(person_ptr_id=person.id)
client.__dict__.update(person.__dict__)
client.save()
other_person = OtherPerson(person_ptr_id=person.id)
other_person.__dict__.update(person.__dict__)
other_person.save()

如果我有一个现成的Client并且想OtherPerson从它们中获取一个,这就是我的确切用例,那么我只需执行以下操作:

client_id = <ID of Client/Person I want to create an OtherPerson with>
p = Person.objects.get(id=client_id)
o = OtherPerson(person_ptr_id=p.id) # Note Person.id and Client.id are the same.
o.__dict__.update(p.__dict__)
o.save()

现在,此人在客户屏幕上显示为“客户”,在其他人屏幕上显示为“其他人”。我可以获得具有所有OtherPerson详细信息和功能的Person的OtherPerson版本,或者可以获得具有所有Client详细信息和功能的Person的客户端版本。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在数组列表中存储同一个父类的两个子类

通常,当两个子类共享同一个父类时,是否可以从另一个子类访问子类?

两个不同类型的对象指向同一个内存位置

C中指向同一个地址的两个不同的指针

检查两个(智能)指针是否指向同一个派生类

同一个 Android getIntent() 可以从两个不同的类接收吗?

我可以从同一个jar文件执行两个不同的类吗?

针对具有两个不同父类的同一个孩子

Kotlin List 和 MutableList:两个不同的引用,指向同一个集合对象

如何将两个不同的项目指向同一个SQLite数据库文件?

带有两个外键字段指向同一个外模型的模型的 Django 聚合?

两个外键指向同一个表/模型

检查两个路径是否指向同一个文件

JPA休眠两个指向同一个表的外键

Ubuntu 18 将两个域指向同一个文件夹

两个File指向同一个文件吗?

如何区分存在于两个不同div中的同一个类HTML

如何在同一个类中创建两个不同的构造函数 - Android

Python3:来自同一个类的两个对象有何不同?

XPATH如何从同一个父对象中选择两个特定的孩子

两个具有相同名称的类可以跨两个不同的程序集位于同一个命名空间中吗?

SQL Server 查询从同一个表中提取两个不同的行

du对同一个文件给出两个不同的结果

来自两个不同文本的同一个单词的单词嵌入

在两个不同的 MODAL BODY 引导程序中加载同一个表

如何从同一个文件分别grep两个不同的模式语句

Firebase Firestore 在同一个应用中使用两个不同的实例

对属于同一个 HTML 标签的两个句子设置不同的样式

SQL两个JOINS同一个表不同的值