我正在使用models.py创建一个django项目,其代码如下:
class Record(models.Model):
id = models.AutoField(primary_key=True)
class TTAMRecord(Record):
client = models.ForeignKey(TTAMClient)
class TTAMClient(models.Model):
...
class Account(models.Model):
records = models.ManyToManyField(Record)
...
我还有以下代码将TTAMRecord
插入records
的{{1}}:
Account
我想做的(但不能)是在帐户的记录对象中调用客户端; e.g:
account = Account.objects.get(...)
client = TTAMClient.objects.create(...)
record = TTAMRecord.objects.create(..., client = client, ...)
account.records.add(record)
但是,如果我不允许这样做,那么account = Account.objects.get(...)
for record in account.records.all():
client = record.client
...
这里存储为record
(没有客户端)类型而不是Record
(具有客户端) )类型......
知道如何施放物体吗?
我想使用更通用的TTAMRecord
代替Record
用于此处未说明的目的......
答案 0 :(得分:1)
由于Record
不是抽象模型,因此它有自己的表和生命周期作为其他模型。但是,您可以record.ttamclient
访问相应的客户端对象,因此您可以将行更改为
account = Account.objects.get(...)
for record in account.records.all():
client = record.ttamclient
...
但是,如果您有多个派生类,这很麻烦。在这种情况下,您必须知道要引用的派生类,并使用相应的属性名称。
答案 1 :(得分:0)
如果我理解你的概念" cast"它不会按照你描述的方式工作。
但是,要使模型继承工作,您需要使用abstract models (see docs)
class Record(models.Model):
# Some generic fields
class Meta:
abstract = True
class TTAMRecord(Record):
client = models.ForeignKey(TTAMClient)
如果您需要将Record
和TTAMRecord
都存储在Account
中,则需要使用多态关系,在Django中,它称为Generic Relations (see docs) < / p>
您需要一个中间模型来存储这些通用关系。所以,基本上你会有一个AccountRecord
和一个Account
模型:
class AccountRecord(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
class Account(models.Model):
records = models.ManyToManyField(AccountRecord)
所以你可以这样做:
account = Account.objects.get(...)
for record in account.records.all():
record_content = record.content_object
if isinstance(record_content, TTAMRecord):
client = record_content.client
else:
# No client available