0

PHPの観点から、私はdjangoにまったく慣れていません。Book、Ebook、Genre、price の 4 つのクラスを持つ実際の基本的なアプリケーションを作成したいと考えています。ブックと電子ブックには、それぞれ 1 つのジャンルと多数の賞品を用意する必要があります。SQL-DB では、id でジャンル テーブルを参照する Book と Ebook にフィールドを配置し、Book_prices のようなものと呼ばれる新しいテーブルを配置して、Books と Ebook を価格にリンクします。

table book_prices
id | type   | price
---+--------+------ 
1  |  book  | 3
2  |  book  | 3 
3  |  ebook | 1

table book/ebook
id | ... | genre_id
---+-----+---------
1  |     | 5
2  |     | 7
3  |     | 9

基本的に、電子ブックと書籍ごとに価格と 1 つのジャンルのリストを追加したいと考えています。djangoモデルを使用してこれを行うにはどうすればよいですか? model.ForeignKey()ジャンルを参照する各書籍/電子書籍に適用できるものを知っています。しかし、私の価格はどうですか?価格に を追加するForeignKey()と、書籍または電子書籍のみを参照できます。

class Book:
    name = models.CharField(max_length=100)
    pages = models.IntegerField()

class Ebook:
    name = models.CharField(max_length=100)
    filesize = models.FloatField()

class Genre:
    name = models.CharField(max_length=100)
    info = models.TextField()

class Price:
    currency = models.CharField(max_length=4)
    amount = models.FloatField()
4

2 に答える 2

2

これが1つの方法です。継承を使用して、クラス間の重複を減らします。contenttypesフレームワークを使用します。また、クラスはサブクラス化する必要がありますdjango.db.models

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

class Genre(models.Model):
    name = models.CharField(max_length=100)
    info = models.TextField()

class Price(models.Model):
    currency = models.CharField(max_length=4)
    amount = models.FloatField()
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    book = generic.GenericForeignKey('content_type', 'object_id')

class BookBase(models.Model):
    name = models.CharField(max_length=100) 
    genre = models.ForeignKey(Genre)

    class Meta:
        abstract = True

class Book(BookBase):
    pages = models.IntegerField()

class Ebook(models.Model):
    filesize = models.FloatField()
于 2012-07-24T11:24:55.693 に答える
0
class Genre:
    name = models.CharField(max_length=100)
    info = models.TextField()

class Price:
    currency = models.CharField(max_length=4)
    amount = models.FloatField()

class Book:
    genre = models.ForeignKey(Genre)
    name = models.CharField(max_length=100)
    pages = models.IntegerField()
    prices = models.ManyToManyField(Price)

class Ebook:
    genre = models.ForeignKey(Genre)
    name = models.CharField(max_length=100)
    filesize = models.FloatField()
    prices = models.ManyToManyField(Price)

Bookインスタンスのすべての価格を取得します。

b1 = Book.objects.get(id=1)
prices = b1.prices.all()

ManyToManyFieldは、手動で行った場合とまったく同じように、舞台裏で中間テーブルを作成します。さらにフィールドを追加する場合は、 throughパラメーターを使用してこのテーブルを明示的に定義することもできます。

価格にはDecimalFieldの使用も検討してください。

于 2012-07-24T11:18:26.797 に答える