最新消息:运维之路

Django – Models(数据库)

脚本编程 admin 129浏览 0评论

Django-Models  模型简介:

模型是你的数据的唯一的、权威的信息源。它包含你所储存数据的必要字段和行为。通常,每个模型对应数据库中唯一的一张。(互联网摘取)

简单地讲  Models 就是Django自带的数据库模型   在Django中,模型就是类,该类提供了一种处理数据库的面向对象方法。通常,每个类都引用一个数据库表,每个属性都引用一个数据库列。你可以使用一个自动生成的API来查询这些表。

关于支持的数据库种类:Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle(挺强大哈。)

先取一个官方文档的例子,

一般模型定义都写在APP/models.py里

 

这里建立了一个Person的表,拥有两个字段分别是first_name和last_name 长度是为30 类型为varchar(CharField) 说到char和varchar 貌似Django建立的都是Varchar 没有找到char的相关文档
对了,如果定义主键的话python会默认自己加一个ID字段设置为主键自增

 

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)


对应的Sql如下 :

CREATE TABLE myapp_person (
“id” serial NOT NULL PRIMARY KEY,
“first_name” varchar(30) NOT NULL,
“last_name” varchar(30) NOT NULL
);

 

一些参数收集
max_length:最大长度
blank:True可以为空
null:可以为null
verbose_name:admin显示名称
default:默认值
unique:True表示唯一
【ImageField】:upload_to表示MEDIA_ROOT的子目录,用来存放上传的文件
【CharField】
【URLField】
【IntegerField】
【DateTimeField】:auto_now_add表示自动设置当前时间
【TextField】
【BooleanField】
【EmailField】
'''

上面的例子仅仅是单一关系的的设定 当然我们程序不可能仅仅只单纯单表不跟其他表有关联 下面写一些关联表的情况
在这里只提经常用到的三种联表结构:

一对多:models.ForeignKey(其他表)
多对多:models.ManyToManyField(其他表)
一对一:models.OneToOneField(其他表)

ForeignKey来自Django官方文档的模型示例:

from django.db import models

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

class Author(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()

class Entry(models.Model):
    blog = models.ForeignKey(Blog)
    authors = models.ManyToManyField(Author)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    pub_date = models.DateField()
    mod_date = models.DateField()
    n_comments = models.IntegerField()
    n_pingbacks = models.IntegerField()
    rating = models.IntegerField()

多对多关系¶
ManyToManyField 用来定义多对多关系,用法和其他Field 字段类型一样:在模型中做为一个类属性包含进来。

ManyToManyField 需要一个位置参数:和该模型关联的类。

例如,一个披萨可以有多种馅料 ,一种馅料 也可以位于多个披萨上。 如下展示:

from django.db import models

class Topping(models.Model):
    # ...
    pass

class Pizza(models.Model):
    # ...
    toppings = models.ManyToManyField(Topping)

和使用ForeignKey 一样,你也可以创建递归的关联关系(对象与自己的多对多关联)和与尚未定义关系的模型的关联关系;详见模型字段参考。

建议你以被关联模型名称的复数形式做为ManyToManyField 的名字(例如上例中的toppings)。

在哪个模型中设置 ManyToManyField 并不重要,在两个模型中任选一个即可 —— 不要两个模型都设置。

通常,ManyToManyField 实例应该位于可以编辑的表单中。在上面的例子中,toppings 位于Pizza 中(而不是在 Topping 里面设置pizzas 的 ManyToManyField 字段),因为设想一个Pizza 有多种Topping 比一个Topping 位于多个Pizza 上要更加自然。按照上面的方式,在Pizza 的表单中将允许用户选择不同的Toppings。

另见

完整的示例参见多对多关系模型示例。

ManyToManyField 字段还接受别的参数,在模型字段参考中有详细介绍。这些选项帮助定义关系应该如何工作;它们都是可选的。

 

 

一对一关系

一对一关系与多对一关系非常相似。如果你在模型中定义一个OneToOneField,该模型的实例将可以通过该模型的一个简单属性访问关联的模型。

例如:

class EntryDetail(models.Model):
    entry = models.OneToOneField(Entry)
    details = models.TextField()

ed = EntryDetail.objects.get(id=2)
ed.entry # Returns the related Entry object.

在“反向”查询中有所不同。一对一关系中的关联模型同样具有一个管理器对象,但是该管理器表示一个单一的对象而不是对象的集合:

e = Entry.objects.get(id=2)
e.entrydetail # returns the related EntryDetail object

如果没有对象赋值给这个关联关系,Django 将引发一个DoesNotExist 异常。

实例可以赋值给反向的关联关系,方法和正向的关联关系一样:

e.entrydetail = ed

转载请注明:DevOps » Django – Models(数据库)

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址