django -- ORM应用及表关系

* 模型常用的字段  
* 表的关系   
* ORM 应用    

## 复习  

```

```

## orm 增删该查  扩展

```
book = Book.objects.filter(name="三国演义",desc='name').first()

books = Book.objects.order_by("-price")  #从高到低进行排序  
    for book in books:
        print(book.name)
    return HttpResponse("图书保存成功")
    
books = Book.objects.order_by("price")  #从低到高进行排序  
    for book in books:
        print(book.name)
    return HttpResponse("图书保存成功")
```

  

## 模型常用的字段   

1.AutoField  int类型  自动增长  

```
id = models.BigAutoField(primary_key=True)  要么不写 自动创建一个主键  既然自定主键的字段   必须要加上  primary_key=True
```

2.BigAutoField 长整型  范围更大   

3.BooleanField bool 类型  

4.CharField 字符串类型     必须要指定 max_length  

5.FloatField

## navie 时间  和 aware 时间      

* navie 时间   幼稚  不知道 自己 位于 哪个时区 
* aware 时间   清除的知道自己 位于哪个时区   
* pytz 管理时区的库 自动更新时区数据    没有安装的话   pip install pytz  
* astimezone 将一个时区转为 另外一个时区的**方法**     这个方法 只能被  aware 时间   不能被 navie 时间调用 

```
>>> import pytz 
>>> from datetime import datatime
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name 'datatime'
>>> from datetime import datetime
>>> now = datetime.now()  #这个时间是  navie 时间  
>>> print(now)
2018-09-17 10:21:46.822158
>>> utc_timezone = pytz.timezone("UTC") #定义一个世界统一时间的 对象 
>>> utc_now = now.astimezone(utc_timezone)#将当前的时间转为 UTC时间  
>>> print(utc_now)

```

6.DateFiled  日期

```
  create_time = models.DateField(auto_now=True)
  # auto_now 每一次更新 都会获取到当前的时间       更新时间   
  # auto_now_add 第一次添加的时候 获取当前时间     创建时间
```

7.DateTimeFiled   日期加时间  

```
 create_time = models.DateTimeField(auto_now=True)
```

8.TimeFiled  时间  

```
create_time = models.DateTimeField(auto_now=True)
```

9.EmailFailed 

```
email = model.EmailFiled(max_length=100,null=False)
在数据库中  会以 varchar的形式  但是 后期 django 自带的表单验证类库 会识别你这个字段是否是 email 要求用户只能输入要 邮箱格式  
```

10.TextFiled 

```
文章内容 用varchar  char 不够用 这个时候 可以使用 TextFiled  

    signature = models.TextField()

```

11.

```
    num = models.IntegerField() 整型
    num1 = models.BigIntegerField() 长整型
    num2 = models.PositiveIntegerField() 正整型 
    num3 = models.SmallIntegerField() 小整型
    num4 = models.PositiveSmallIntegerField()正小整型  
```

12. URLFiled 

```
存放url的字符串    
```

13 .UUIDField

```
只能存放  uuid 类型   
```

### 字段的参数  

* null   是否为空  
  * null=False 
* default  默认值  
* primary key  = True  是否为主键 
* unique =True 是否唯一 
* db_column   

```
 username = models.CharField(max_length=100,null=True)
age = models.IntegerField(null=True,db_column='author_age',default=0)
create_time = models.DateTimeField(default=now)
tele = models.CharField(max_length=100,unique=True,null=True)
```

## mysql引擎  

```
show engines;


myisam  
  1.   frm  表结构文件
  2.   myd  数据文件
  3.   myi  索引文件 
  
  当 对 读 和插入要求 高的话 一般选择   myisam    
  myisam 支持全文索引 
  不支持事务  
  表锁  
  不支持外键  
innodb 
  1.ibd  数据和索引 共享一个表空间 
  2.frm  表结构文件  
  
  如果对 数据 安全性要求很高 也就是 经常对数据 更新 和删除操作   要使用innodb 
  mysql5.6 以后 默认的引擎是  innodb  
  mysql5.7 以后 innodb 也支持全文索引  
  支持事务  
  行锁 
  支持外键  
```

## 外键 及表关系  

```
class User(models.Model):
    username = models.CharField(max_length=20,null=False)
    password = models.CharField(max_length=100)


class Article(models.Model):
    title = models.CharField(max_length=100,null=False)
    content = models.TextField()
    author = models.ForeignKey("User",on_delete=models.CASCADE)
    
  
  
  
 on_delete=
 1.models.CASCADE  删除掉user表里边的 那么 article 与其关联的数据 一并删除 
 2.on_delete=models.PROTECT 受保护  不让你删除    
 3.on_delete=models.SET_NULL,null=True
 4.on_delete=models.SET_DEFAULT,default=User.objects.get(pk=2) 关联的用户删除以后 这个字段会立马变成默认值  
 5.on_delete=models.DO_NOTHING 
 
 
 1  2 4  用的比较多    
 以上 这些 是  django级别  最终还要看数据库级别  
```

### 表关系  

* 一对一 
* 一对多 
* 多对多  

#### 一对 多  

```
一篇文章  一个作者写       一个作者可以写多篇文章  作者 和文章之间的关系  就是   一对多  


def one_to_many_view(request):
    # article = Article(title="红楼梦",content="12213阿达")
    # category = Category.objects.first()
    # author = FrontUser.objects.first()
    # article.category = category
    # article.author = author
    #
    # article.save()
    # return HttpResponse("添加成功")
    #获取某个分类下面的所有的文章
    # category = Category.objects.first() #获取指定的分类 
    # articles = category.article_set.all() #自动的产生一个article_set
    # for article in articles:
    #     print(article.title)
    #将文章添加到指定的分类中
    category = Category.objects.first() #先获取到分类
    article = Article(title="ccc",content="hahaha") #创建文章
    article.author = FrontUser.objects.filter(id="2").first() #选中作者
    category.article_set.add(article,bulk=False)


    return HttpResponse("添加成功")
```

#### 一对一  

```
一个用户只有一个身份证号   只有一个用户详情  
在django 中  一对一是通过  models.OneToOneFiled 

第一步 我们在 frontuser 里边  新添加了一个模型 叫用户详情    
class FrontUser(models.Model):
    name = models.CharField(max_length=100,null=False)
    def __str__(self):
        return "<FrontUser:(id:%s,name:%s)>" % (self.id,self.name)

class UserExtension(models.Model):
    school = models.CharField(max_length=100)
    user = models.OneToOneField("FrontUser",on_delete=models.CASCADE)
    def __str__(self):
        return "<UserExtension:(id:%s,school:%s,user:%s)>" % (self.id,self.school,self.user.id)
 2.在article 模型中  创建  控制器  
 
 def one_to_one(request):
    user = FrontUser.objects.filter(id="2").first() 首先将 id为2的 用户查出来   
    extension = UserExtension(school="千锋") #然后给他添加详情  
    extension.user = user 赋值外键的内容   
    extension.save()  #保存  
  
    return HttpResponse("添加成功")
```

#### 多 对 多  

```
一个文章  可以 拥有多个标签    一个标签可以被 多篇文章使用    

class Article(models.Model):
    title = models.CharField(max_length=100,null=False)
    content = models.TextField()
    category = models.ForeignKey("Category",on_delete=models.CASCADE,null=True)
    author = models.ForeignKey("frontuser.FrontUser",on_delete=models.CASCADE)
# Create your models here.
class Tag(models.Model):
    name = models.CharField(max_length=100,null=False)
    article = models.ManyToManyField("Article")
    
views.py 

def many_to_many(request):
    # article = Article.objects.first() #获取第一篇文章
    # tag = Tag(name="热门文章")
    # tag.save() #先将标签保存
    # #然后将标签添加到文章上面
    # article.tag_set.add(tag)
    tag =Tag.objects.get(pk=2)
    article = Article.objects.get(pk=2)
    tag.article.add(article)
    return HttpResponse("添加成功")
```

猜你喜欢

转载自blog.csdn.net/qq_42336700/article/details/82765398