pho*_*ley 11 abstract-class foreign-keys django-models
我正在开发一个django项目,我在其中创建了一组三个抽象模型,稍后我将用于各种应用程序.我遇到的问题是我想通过ForeignKey连接这些模型但django告诉我它不能将foreignkeys分配给抽象模型.
我目前的解决方案是在我在其他应用程序中实现该类时指定外键.但是,我正在为抽象类(书和页)编写一个管理器,并且需要访问这些外键.我基本上要做的是以无状态的方式获得一本书所具有的单词数量,因此不将其存储在页面或书籍的字段中.
该模型看起来类似于:
class Book(models.Models):
name = models.CharField(...)
author = models.CharField(...)
...
class Meta:
abstract = True
class Page(models.Models):
book = models.ForeignKey(Book)
chapter = models.CharField(...)
...
class Meta:
abstract = True
class Word(models.Models):
page = models.ForeignKey(Page)
line = models.IntegerField(...)
...
class Meta:
abstract = True
Run Code Online (Sandbox Code Playgroud)
请注意,此处的模型只是为了举例说明我要做的事情,因此不需要从实现的角度来看这个模型(Book-Page-Word)是否有意义.
Mic*_*nor 13
也许你需要的是一个GenericForeignKey,因为你实际上并不知道你ForeignKey会指出什么样的模型?这意味着你将失去一些正常关系的"类型安全"保证,但它允许你以更一般的方式指定这些关系.请参阅https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#django.contrib.contenttypes.generic.GenericForeignKey
Django模型继承是一件很酷的事情,并且很好地作为使你的模型DRYer的快捷方式,但并不总能很好地与我们通常拥有的类的多态性思想很好地配合.
这种方法怎么样?我正在考虑自己使用它来延迟关系定义,直到我继承。
# 这是一个非常非常人为(但简单)的例子。
def AbstractBook(AuthorModel):
class AbstractBookClass(Model):
name = CharField(max_length=10)
author = ForeignKey(AuthorModel)
class Meta:
abstract = True
return AbstractBookClass
class AbstractAuthor(Model):
name = CharField(max_length=10)
class Meta:
abstract = True
class BadAuthor(AbstractAuthor):
pass
class BadBook(AbstractBook(BadAuthor)):
pass
class GoodAuthor(AbstractAuthor):
pass
class GoodBook(AbstractBook(GoodAuthor)):
pass
Run Code Online (Sandbox Code Playgroud)