在django模型中投射对象

时间:2013-04-12 02:27:18

标签: python django

我正在使用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用于此处未说明的目的......

2 个答案:

答案 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)

如果您需要将RecordTTAMRecord都存储在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