3

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

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

# 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)

问题是在管理员中,我希望能够创建 aBook或 aMagazineArticle作为摘录的来源,而无需在每个摘录中都有单独的字段。

我读过的一种可能可行的方法是泛型关系,可能使用抽象基类,但我没有找到任何在我的上下文中有意义的示例。

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

4

2 回答 2

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)
于 2013-07-20T03:45:33.507 回答
0

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

# admin.py
# imports go here...
source = Source() 
source.save()
excerpt1 = Excerpt(source=source)
book = Book() 
book.save()
except2 = Excerpt(source=book.source)  # source=book may also work; haven't checked... 
book2 = excerpt2.source.book
if book is book2:
    except2.save() # only save this if my code is correct... 
于 2017-05-23T17:08:53.890 回答