我只是在学习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个人可以创建一个“绿色沙发”,每个都有不同的平方英尺。
答案 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,而是你不知道如何为你的应用程序建模。
Djangos模型只是下面数据库设计的抽象。
例如,您在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为应用程序建模之前,也许应该首先了解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方法的原因是数据在尽可能标准化时是最佳的。如果你有宽度和长度,那么当有人要求时,你有长度,宽度,平方英尺,如果你也增加了高度和体积。