Django mod中的投射对象

2024-10-01 17:32:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个django项目模型.py有以下代码:

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插入Accountrecords

^{pr2}$

我想做的(但不能)是在帐户的record对象中调用客户机;例如:

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

但是,如果不允许我这样做,因为record被存储为Record(它没有客户机)类型,而不是{}(它有客户机)类型。。。在

你知道怎么投射这个物体吗? 我想使用更通用的Record而不是{}来达到本文没有说明的某些目的。。。在


Tags: django代码client类型客户机modelmodelsaccount
2条回答

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

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

但是,如果您有多个派生类,这就不麻烦了。在这种情况下,您必须知道所引用的派生类并使用相应的属性名。在

如果我理解你的“演员”概念,它就不会像你描述的那样有效。在

但是,要使模型继承工作,您需要使用abstract models (see docs)

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

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

如果您需要Record和{}都存储在Account中,那么您将需要使用多态关系,在Django中它被称为Generic Relations (see docs)

您将需要一个中介模型来存储这些通用关系。所以,基本上你会有一个AccountRecord和一个Account模型:

^{pr2}$

所以你可以:

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

相关问题 更多 >

    热门问题