使用Django创建“类”

时间:2010-02-05 03:33:40

标签: python django

我只是在学习Django,所以我可以随心所欲地纠正我。我可能只需要调整心态。

我要做的是以OOP风格创建“类”。例如,假设我们正在设计一堆房间。每个房间都有家具。每件家具都有一个类型和一个颜色。到目前为止我能看到的是我可以拥有

class FurnitureType(models.Model):
    name = models.CharField(max_length=200)

class FurnitureColor(models.Model):
    name = models.CharField(max_length=50)

class FurniturePiece(models.Model):
    type = models.ForeignKey(FurnitureType)
    color = models.ForeignKey(FurnitureColor)
    sqft = models.IntegerField()
    name = models.CharField(max_length=200)

class Room(models.Model):
    name = models.CharField(max_length=200)
    furnitures = models.ManyToManyField(FurniturePiece)

问题是,如果我从Django管理界面中选择它,每个FurniturePiece都必须有一个唯一的名称。如果一个人创造了“绿色沙发”,那么没有其他人可以拥有“绿色沙发”。我想知道的是,如果a)我需要了解更多关于Django UI的知识,这是在Django中设计这个的正确方法,或者b)我对这个域有一个糟糕的设计

我希望家具名称独特的原因是因为10个人可以创建一个“绿色沙发”,每个都有不同的平方英尺。

3 个答案:

答案 0 :(得分:4)

我没有使用唯一名称来解决问题。您可以将其指定为唯一:

class FurniturePiece(models.Model):
    type = models.ForeignKey(FurnitureType)
    color = models.ForeignKey(FurnitureColor)
    sqft = models.IntegerField()
    name = models.CharField(max_length=200, unique=True)

我不知道您是否必须了解 Django UI 。我想你必须学习how to define models。管理界面只是基于模型的生成界面。您可以在某些方面change the interface而无需更改模型,但除此之外,您还无需了解管理界面。

我建议你按照像djangobook这样的教程来开始使用Django。


我认为,你遇到的问题不是如何使用Django,而是你不知道如何为你的应用程序建模。

  • 首先,你必须考虑你有哪些实体(如房间,家具等)。
  • 然后想想他们有什么关系。
  • 之后你可以在Django中对它们进行建模。当然,为了做到这一点,你必须知道如何建立关系的模型。语法可能是Django特定的,但逻辑关系不是。例如。多对多关系不是Django特有的,这是在数据库中用来表达某种关系的术语。

Djangos模型只是下面数据库设计的抽象。


例如,您在RoomFurniturePiece之间指定了多对多关系 现在的问题是:这是你想要的吗?这意味着一件家具可以属于多个房间。这听起来很奇怪。所以也许你想要模仿一件家具只属于一个房间。但是一个房间应该还有几件家具。因此,我们定义了从FurniturePieceRoom的关系。

在Django中,我们可以用以下方式表达:

class FurniturePiece(models.Model):
    room = models.ForeignKey(Room)
    type = models.ForeignKey(FurnitureType)
    color = models.ForeignKey(FurnitureColor)
    sqft = models.IntegerField()
    name = models.CharField(max_length=200)

在使用Django为应用程序建模之前,也许应该首先了解relational databases以获取基础知识。

为了在Django中创建应用程序,可能不需要这样做。但它肯定会帮助你了解最新情况,对于每个ORM而言,不只是Django的。

答案 1 :(得分:3)

为什么每个FurniturePiece都需要一个唯一的名称?在我看来,如果你删除那个约束,一切都会起作用。

(顺便说一下,你似乎不小心丢弃了除了Room模型之外的所有模型的模型基类。)

答案 2 :(得分:1)

我就是这样做的:

class Room(models.Model):
    name = models.CharField(max_length=255)
    pieces = models.ManyToManyField('FurniturePiece')

class FurniturePiece(models.Model):
    itemid = models.CharField(max_length=20, unique=True)  # This is what I would require to be unique.
    name = models.CharField(max_length=255)
    type = models.ForeignKey('FurnitureType')  # Note I put 'FurnitureType' in quotes because it hasn't been written yet (coming next).
    color = models.ForeignKey('FurnitureColor')  # Same here.
    width_in_inches = models.PositiveIntegerField()
    length_in_inches = models.PositiveIntegerField()

    # Next is the property decorator which allows a method to be called without using ()
    @property
    def sqft(self):
        return (self.length_in_inches * self.width_in_inches) / 144  # Obviously this is rough.


class FurnitureType(models.Model):
    name = models.CharField(max_length=255)

class FurnitureColor(models.Model):
    name = models.CharField(max_length=255)

将对象视为真实生活对象,您也将对代码有更深入的了解。我的sqft方法的原因是数据在尽可能标准化时是最佳的。如果你有宽度和长度,那么当有人要求时,你有长度,宽度,平方英尺,如果你也增加了高度和体积。