Django相关的抽象类经理

时间:2018-05-23 08:14:46

标签: django django-models foreign-keys abstract

我想迭代所有的ConnectorModels实例。

class ClientModel(models.Model):
    account = models.ForeignKey(Account, on_delete=models.CASCADE)

class ConnectorModel(models.Model):
    client = models.ForeignKey(ClientModel, on_delete=models.CASCADE)
    class Meta:
        abstract = True

class TelegramModel(ConnectorModel):
    phone = models.CharField(max_length=20)

class URLModel(ConnectorModel):
    phone = models.UR(max_length=20)

当我现在获得ClientModel的实例化版本时,我希望得到一个connectermodel_set属性,但是我得到了一个TelegramModel_set和一个URLModel_set。

如何获取connectormodel_set?

编辑:

connectormodel_set应返回所有相关电报和网址模型的并集

2 个答案:

答案 0 :(得分:1)

您无法使用抽象模型。 ForeignKey需要指向实际表中的ID,而抽象模型不表示表。

有两种方法可以实现您的目标。第一种是使用具体的基础模型 - 每次都有额外的数据库连接以获得扩展数据。第二种是使用generic relations而不是外键。

答案 1 :(得分:0)

这是因为你的ConnectorModel是抽象模型,而不是真实模型。它仅用于制作其他模型 - TelegramModelURLModel用于您的情况。

如果您想致电ConnectorModel,请从ConnectorModel删除摘要。并为其他人制作其他抽象模型,或者只为连接器模型制作电报和网址字段。如下。

class ClientModel(models.Model):
    account = models.ForeignKey(Account, on_delete=models.CASCADE)

class ConnectorModel(models.Model):
    client = models.ForeignKey(ClientModel, on_delete=models.CASCADE)
    telegram_phone = models.CharField(max_length=20)
    url_phone = models.CharField(max_length=20)
    # remove abstract
    # class Meta:
    #   abstract = True

# add models with client ForeignKey 
class TelegramModel(models.Model):
    client = models.ForeignKey(ClientModel, on_delete=models.CASCADE)
    phone = models.CharField(max_length=20)

class URLModel(models.Model):
    client = models.ForeignKey(ClientModel, on_delete=models.CASCADE)
    phone = models.UR(max_length=20)