我目前正在尝试在模型中实现Django中的书籍结构。
结构如下
图书分类:
标题
页面(这是一个页面对象数组)
参考书目(标题和链接词典)
页面类:
标题
部分(部分对象数组)
图像(图像网址数组)
章节类:
标题:
文本:
图像(图像网址数组)
视频(视频网址数组)
我是Django和SQL结构的新手。我的问题具体是什么,为了使每个条目都具有上面列出的组件的书籍的数据库,最好的方法是什么?我知道最好的方法是拥有一个书籍表,其中每个条目与页面具有一对多的关系,而这些页面又与页面具有一对多的关系。但我不清楚将Django模型连接在一起以及如何启用对象列表(重要的是这些列表必须是动态的)。
答案 0 :(得分:1)
SQL没有“数组”的概念 - 表中的每个字段都是原子的(包含单个值) - 所以如果你想要一个实体A
“拥有”许多(“数组”)另一个实体B
您需要(至少)两个表(一个用于B
,一个用于A
)以及这些表之间的关系。在这里你可以有两种关系:“一对多”和“多对多”。
如果Book
的实例只能属于Page
的单个实例 - 例如Page
- > Book
Book
属于单Page
的{{1}}关系(显然),您有“一对多”关系(Page
有一个或{更多Book
,page
属于单个book
)。在数据库级别,这由A
表实现,该表具有指向其所属的B
的主键的外键字段。在Django模型中,这是使用reindex
完成的。
如果B
的实例包含多个A
且Book
的实例可以属于多个Author
,则您有多对多的关系。这可能是Author
- >的情况。 Book
关系(Book
写入一个或多个Author
,Book
由一个或多个Author
写入。在数据库级别,这是实现的通过附加表格,其中“book”上有外键,“author”上有外键(通常是两个键的“唯一”约束,因此您不会将同一作者的两次关联到同一本书)。 Django,这是在任何BibliographyItem
或(nb:exclusive'或')ForeignKey
模型上使用models.ForeignKey()
field完成的,Django将自己创建中间表。
因此,对于您的示例,您将需要:
根据您是否希望能够在书籍之间共享相同的Book
,您可能需要在“ManyToMany
上使用ManyToMany字段或Image
。” case(并且不知道更多关于你的项目的要求)我宁愿选择Video
关系(很可能不止一本书会引用同一个项目。)
对于@Consumes(MediaType.APPLICATION_JSON)
和@Path("/select")
@GET
@Produces(MediaType.APPLICATION_JSON)
public String select(@QueryParam("data")String data) {
,您可以选择在不同部分之间共享它们。
我强烈建议您阅读更多(并做一些教程)关于关系数据库建模和关系模型规范化,以了解核心概念以及如何正确设计模型。 Django的ORM只是数据库表和字段的一个薄包装器,所以如果你希望做任何好事,你真的需要了解数据库级别的内容。
答案 1 :(得分:-1)
每个Django模型都是您在应用中导入的类,以便能够使用它们。要将模型连接在一起,您可以使用外键来定义关系,即您的Page类将具有Book中的外键。要在列表中存储列表,其中一种方法是使用json模块将列表转换为字符串,并将该字段定义为文本字段。 json.dumps将列表转换为字符串,json.loads将字符串转换回列表。或者,如果你在谈论其他"列表"在你的问题中,那么你所需要的只是django的基本查询集,你可以通过model.objects.get()获得。 Queryset是表中的行列表。