Django 是开源 Python Web 框架,当初选择 Django 框架的原因之一就是它具有优雅的文档,阅读文档是利用 Django 特性来实现网站功能最直接的途径,尽管通过 Python 也可以实现 Django 提供的功能,但这不是我们想要的。本文对文档中隐含了意思的句子进行注解并分享出来,希望和大家一起进步。
本文学习解读模型层,引用的部分是文档的原文摘抄,紧随着的是原文的解读。
ForeignKey 类需要添加一个位置参数,即你想要关联的模型类名
解读: 我们知道 Django 会为每一个模型创建数据库表,将属性映射为一个数据库列。因此可以联想到 models.ForeignKey() 方法实际映射了数据库操作中创建外键的操作。而创建外键操作是在从表进行,本例中 Manufacture 为主表,Car 为从表,因此在 Car 类中调用 ForeignKey()。
在多对多(many-to-many)关系中添加添加额外的属性字段
解读: Person与 Group 在 E-R 模型中为两实体组成 m:n 联系,在数据库课程中我们学习过如果两实体满足1. 两实体组成m:n联系 2.联系带有描述属性时,必须将该联系单独转化为实体,并且将两个参与实体的主键设为外键。因此在该例子中 Membership 类就体现了这一点,其字段 person, group 为外键,data_joined, invited_reason 为联系的描述属性。注意不要忘记使用 through 参数来体现 Person 与 Group 之间存在含有描述属性的联系。
ringo = Person.objects.create(name="Ringo Starr")
解读: 对应数据库中的插入操作
>>> beatles.members.all()
# <QuerySet [<Person: Ringo Starr>]>
解读: 该操作比较有趣,在 sql 中与它等价的一个查询逻辑为 select Person.name from Person natural join Membership natural join Group
>>> beatles.members.all()
# <QuerySet [<Person: Ringo Starr>, <Person: Paul McCartney>, <Person: Ringo Starr>]>
解读: 可以看到查询结果中 Ringo Starr 出现了两次,这是正常的,因为 Person 与 Group 原本就是 m:n 联系,为了更方便查看,能不能让重复的结果只出现一次呢?这是可以的,需要利用查询的手段,在 sql 中为 select distinct xxx from xxx where xxx。Django 文档中暂时没有看到对应的 api,猜测可能会在 beatles.members.all()中以关键字参数设置的形式来实现。
你也可以将一个指向 Place OneToOneField 放到 Restaurant 当中(因为餐厅“是一个”地点);事实上,在处理这样的情况时最好使用 模型继承 ,它隐含的包括了一个一对一关系。
解读:如果两个模型的其中之一字段属性比较少,完全可以使用模型继承
460

被折叠的 条评论
为什么被折叠?



