使用Django创建“类”

2 投票
3 回答
5296 浏览
提问于 2025-04-15 18:55

我刚开始学习Django,所以如果我有什么错误的理解,请随时纠正我。我可能只是需要调整一下我的思维方式。

我想做的是用面向对象编程的风格来创建一个“类”。比如说,我们要设计一些房间。每个房间都有家具。而每件家具都有一个类型和颜色。目前我能看到的是,我可以有

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的管理界面中选择它的话。如果一个人创建了“绿色沙发”,那么其他人就不能再创建“绿色沙发”了。我想知道的是,a) 我是否需要更多地了解Django的用户界面,这样设计是否正确,或者 b) 我对这个领域的设计是否有问题。

我希望家具名称是唯一的原因是,因为可能会有10个人都创建一个“绿色沙发”,但每个人的面积可能不同。

3 个回答

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)这个方法的原因是,数据最好尽可能标准化。如果你有宽度和长度,那么当有人问你时,你就可以提供长度、宽度、平方英尺,甚至如果你再加上高度,还能得到体积。

3

为什么每个家具件都需要有一个独特的名字呢?我觉得如果去掉这个限制,其他的东西似乎也能正常运作。

顺便提一下,除了房间模型之外,你好像不小心漏掉了所有模型的基类 models.Model。

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。我想你需要学习 如何定义模型。管理界面只是根据你的模型生成的界面。你可以在某些方面 更改界面,而不需要改变模型,但除此之外,关于管理界面需要学习的东西不多。

我建议你跟着像 djangobook 这样的教程,来好好入门 Django。


我觉得你遇到的问题不是如何使用 Django,而是你不知道如何整体建模你的应用。

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

Django 的模型只是对底层数据库设计的抽象。


比如你指定了 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 来建模你的应用。

虽然这可能不是创建 Django 应用的必要条件,但它肯定会帮助你理解发生了什么,不仅仅是 Django 的 ORM。

撰写回答