gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:17:22 26 4
gpt4 key购买 nike

我有一个模型 Person存储有关人的所有数据。我也有 Client扩展人的模型。我有另一个扩展模型 OtherPerson这也扩展了 Person模型。我想创建一个指向 Person 的客户端,并且还创建一个 OtherPerson指向该记录的记录 Person .基本上,我想要一个 Person对象被视为 ClientOtherPerson ,取决于当前 View 。这是否可能与 Django 的 ORM 一起使用,或者我是否需要以某种方式编写一个原始查询来创建这个场景。我很确定这在数据库方面是可能的,因为两个子类都将使用其 person_ptr_id 字段指向父 Person 类。

简单地说,如果我创建一个 Client (因此是 Person ),我也可以创建一个 OtherPerson使用基的对象 Person来自 Client .这样我就可以将它们视为 Client或作为 OtherPerson , 保存一个会影响 Person每个领域?

“水平”多态性?

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

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>

最佳答案

好吧,我讨厌回答我自己的问题,尤其是因为它有点重复 ( Django model inheritance: create sub-instance of existing instance (downcast)?

@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()

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

关于Django:两个不同的子类指向同一个父类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18130124/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com