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または a のいずれかを作成できるようにしたいということです。MagazineArticle

これを行うことについて私が読んだ方法の 1 つは、ジェネリック リレーションであり、代わりに抽象基本クラスを使用する可能性がありますが、私のコンテキストで意味のある例は見つかりませんでした。

これを実行する方法は何ですか(できれば例を使用して)?

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 に答える