1

我正在使用具有以下代码的 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)
      ...

我还有以下代码可以将 a 插入TTAMRecord到arecordsAccount

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的而不是TTAMRecord用于此处未说明的某些目的...

4

2 回答 2

1

由于Record不是抽象模型,它与其他模型一样有自己的表和生命周期。但是,您可以将相应的客户端对象访问为record.ttamclient,因此您可以将您的行更改为

account = Account.objects.get(...)
for record in account.records.all():
    client = record.ttamclient
    ...

但是,如果您有多个派生类,这会有点麻烦。在这种情况下,您必须知道您指的是哪个派生类并使用相应的属性名称。

于 2013-04-12T04:36:36.083 回答
0

如果我理解您的“演员”概念,它将不会按照您描述的方式工作。

但是,要使模型继承起作用,您需要使用抽象模型(请参阅文档)

class Record(models.Model):
    # Some generic fields
    class Meta:
        abstract = True

class TTAMRecord(Record):
    client = models.ForeignKey(TTAMClient)

如果您需要两者RecordTTAMRecord存储在其中Account,则需要使用多态关系,在 Django 中它被称为通用关系(请参阅文档)

您将需要一个中间模型来存储这些通用关系。所以,基本上你会有一个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
于 2013-04-12T04:36:05.097 回答