使用Django创建“类”
我刚开始学习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 个回答
我会这样做:
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)这个方法的原因是,数据最好尽可能标准化。如果你有宽度和长度,那么当有人问你时,你就可以提供长度、宽度、平方英尺,甚至如果你再加上高度,还能得到体积。
为什么每个家具件都需要有一个独特的名字呢?我觉得如果去掉这个限制,其他的东西似乎也能正常运作。
顺便提一下,除了房间模型之外,你好像不小心漏掉了所有模型的基类 models.Model。
我不太明白关于唯一名称的问题。你可以直接指定它为唯一的:
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 的模型只是对底层数据库设计的抽象。
比如你指定了 Room
和 FurniturePiece
之间的多对多关系。
现在问题来了:这真的是你想要的吗?这意味着一件家具可以属于多个房间。这听起来有点奇怪。所以也许你想建模成一件家具只属于一个房间,但一个房间应该有多件家具。因此我们定义一个从 FurniturePiece
到 Room
的关系。
在 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。