0

从 PHP 的角度来看,我对 django 完全陌生。我想写一个真正的基本应用程序,有四个类:Book、Ebook、Genre 和 price。每本书和电子书都应该有一个类型和多个奖项。在 SQL-DB 中,我会在 Book 和 Ebook 中放置一个字段,通过 id 引用流派表和一个名为 Book_prices 的新表,它将书籍和电子书链接到价格。

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

基本上,我想为每本电子书和书籍添加价格列表和一种类型。如何使用 django 模型做到这一点?我知道model.ForeignKey()哪个可以应用于每本引用流派的书/电子书。但是我的价格呢?如果我将 a 添加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

这是一种方法。它使用继承来减少类之间的重复。它使用内容类型框架。您的课程也需要子类化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 回答