我有一个这样的模型:
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”的关系, 要么没有安装,要么是抽象的。
我做错什么了吗? 如何避免这种情况?
预先感谢
答案 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
答案 2 :(得分:1)
我找到了解决方法:
name = models.ForeignKey(A, null=True, blank=True, on_delete=models.SET_NULL, related_name="content_%(class)s")