经过大量的搜索,只找到了一些可以让我这样做的技巧(甚至更少的工作示例),我把它带给你。
以下是类似于我正在使用的类结构:
# 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)
在管理员中,我希望能够创建Book
或MagazineArticle
作为摘录的来源,而不会在每个摘录中包含单独的字段。
我读到的关于这样做的一种方法可能有效,可能是使用抽象基类,但我没有找到任何在我的上下文中有意义的例子。
执行此操作的方法有哪些(最好使用示例)?
答案 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}}