Django admin:允许ForeignKey基类来引用它的子类

时间:2013-07-19 11:05:14

标签: python django

经过大量的搜索,只找到了一些可以让我这样做的技巧(甚至更少的工作示例),我把它带给你。

以下是类似于我正在使用的类结构:

# sources/models.py
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=256)
    slug = models.SlugField()


class Source(models.Model):
    author = models.ForeignKey(Author)
    url = models.URLField(help_text='The URL where a copy of the source can be found.')


class Book(Source):
    title = models.CharField(max_length=256)
    page = models.PositiveSmallIntegerField(help_text='Page where the source text appears.')


class MagazineArticle(Source):
    magazine_name = models.CharField(max_length=256)
    issue_date = models.DateField()
    title = models.CharField(max_length=256)

在另一个应用程序中,我会这样:

# excerpts/models.py
from django.db import models
from sources.models import Source

class Excerpt(models.Model):
    excerpt = models.TextField()
    source = models.ForeignKey(Source)
    # Perhaps should be:
    # source = models.OneToOneField(Source)

在管理员中,我希望能够创建BookMagazineArticle作为摘录的来源,而不会在每个摘录中包含单独的字段。

我读到的关于这样做的一种方法可能有效,可能是使用抽象基类,但我没有找到任何在我的上下文中有意义的例子。

执行此操作的方法有哪些(最好使用示例)?

2 个答案:

答案 0 :(得分:0)

任何一个都应该工作。这是您使用抽象基类的方法:

class Excerpt(models.Model):
    excerpt = models.TextField()
    source = models.ForeignKey(Source)

    class Meta:
        abstract = True

class Book(Excerpt):
    pass
class Magazine(Excerpt):
    pass

现在你可以做到:

book = Book.objects.all()
magazine = Magazine.objects.filter(source=1)

答案 1 :(得分:0)

您的代码已经是实现您想要的正确方法。 你有什么是多表继承。 Source有自己的表,所有子类(Book,MagazineArticle)都有自己的表。您创建的任何书籍或杂志都将自动在数据库端创建源;当你引用子类模型时,它也表现为“具有额外字段的源”。 另请注意,从子类到基类和基类到子类创建一对一字段。 这就是管理员应该看的样子:

{{1}}