如何在Django中将抽象模型用作ForeignKey?

时间:2018-07-06 16:03:26

标签: python django python-3.x django-models

我有一个这样的模型:

class A(models.Model):
     ....
     ....
     class Meta:
        abstract = True

class B(A):
     blah..
     blah..

class C(A):
     blah..
     blah..

我只是想将模型A用作不同模型中的外键 像这样:-

class X(models.Model):
       """
       I want to use like this, But i'm getting error
       """
       name = models.ForeignKey(A)

但是我遇到了错误:

  

apis.X.name:(fields.E300)字段定义与模型“ A”的关系,   要么没有安装,要么是抽象的。

我做错什么了吗? 如何避免这种情况?

预先感谢

3 个答案:

答案 0 :(得分:1)

在您的Meta中设置Abstract=True意味着您的数据库中没有创建表。

来自docs

  

当您想添加一些常见的基类时,抽象基类非常有用   信息转化为许多其他模型。你写你的基类   并将abstract = True放在Meta类中。则此模型将不会   用于创建任何数据库表。而是当它用作基础时   其他模型的类,其字段将添加到孩子的字段中   课。

要解决您的问题,您应该对模型B或模型C使用外键,因为它们将代表数据库中的实际表。您的抽象模型应仅用于继承目的。

答案 1 :(得分:1)

Django提供了一种特殊的字段类型(GenericForeignKey),可以解决此问题,并允许与任何模型(无论是抽象模型)之间的关系。

请参阅 GenericForeignKey Docs,以获取更多信息。

from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models

class TaggedItem(models.Model):
    tag = models.SlugField()
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

def __str__(self):
    return self.tag

或:

您可以通过在其中使用abstract = True来将自定义模型实现为基本模型,在子模型中可以将其用作 ForeignKey

实施方式如下:

class X(models.Model):
   """
   I want to use like this, But i'm getting error
   """
   name = models.ForeignKey(A)
   class Meta:                                                             
       abstract = True                                                     
return A                                                   

为此,转到abstract-base-classes Docs:

答案 2 :(得分:1)

我找到了解决方法:

name = models.ForeignKey(A, null=True, blank=True, on_delete=models.SET_NULL, related_name="content_%(class)s")