美文网首页
Django_ORM CRUD

Django_ORM CRUD

作者: 钱塘 | 来源:发表于2017-08-18 15:36 被阅读6次

model表模型

# coding=utf8

from django.db import models


# Create your models here.


class Book(models.Model):
    title = models.CharField(max_length=64)
    price = models.IntegerField()
    color = models.CharField(max_length=64)
    page_num = models.IntegerField(null=True)
    publisher = models.ForeignKey("Publisher")  # 一对多关系
    # publisher名字可以自己定义
    # django会自己加一个_id,自己插入的时候也要加id

    author = models.ManyToManyField("Author")  # 多对多关系

    def __str__(self):
        return self.title


class Publisher(models.Model):
    name = models.CharField(max_length=64)
    city = models.CharField(max_length=63)

    def __str__(self):
        return self.city


class Author(models.Model):
    name = models.CharField(max_length=30)

    def __str__(self):
        return self.name

创建表

1 创建单表:

这张表和其他表没有关系

2 创建关联表 | 外键
  • 一对一
  • 一对多 (重点)(ForeignKey)
  • 多对多 (重点)(ManyToMany)

一个类对应一张表,类实例出来的对象对应每一行的数据。

没有外键时:

        方式一:   models.Author.objects.create(name='Alvin')
        方式二:   dic = {"name":"alex","age":"27"} 
                 models.Author.objects.create(**dic)
如果有外键:

     一对多:  
             (1). modles.Book.objects.create(title='python',price=12,publisher_id=2)
              
              #publisher后在加_id,这是django自行实现的 (推荐)

             (2). modles.Book.objects.create(title='python',price=12,publish = obj) #object 


     
    多对多:
            将两者的外键取出来另建第三张表,含有三列: id book_id publisher_id  
            绑定:add() 取消:remove()
            
            ---- 正向查询
            book = models.Book.objects.filter(id=2)[0]
            authors = models.Author.objects.filter(id__gt=2)
            book.author.add(*authors)  //因为是序列,所以要加*
            
            //移除 book.author.remove(*authors)
            
            ---- 反向查询
            author=models.Author.objects.filter(id=2)[0]
            books=models.Book.objects.filter(author__gt=2)
            author.book_set.add(*books)
           
           //移除 author.book_set.remove(*books)
                
实例2

          * 涉及多对多关系  增加对象 


        name = request.POST.get('name')     # 此处name是一个对象 代表1
        cls = request.POST.getlist('cls')   # 此处cls是一个列表 代表多
        # print(name,cls)
        obj = models.Teacher.objects.create(name=name)  #创建对象1
        obj.cls.add(*cls)                  # 增加对象关联的班级          



* 涉及多对多关系  增加对象 


        name = request.POST.get('name')     # 此处name是一个对象 代表1
        cls = request.POST.getlist('cls')   # 此处cls是一个列表 代表多
        # print(name,cls)
        obj = models.Teacher.objects.create(name=name)  #创建对象1
        obj.cls.add(*cls)                  # 增加对象关联的班级          


1. 查对象的一个属性

        obj = models.Classes.objects.all().value('id')

* 重设多的属性 

        cls_li = request.POST.getlist('cls')
        obj = models.Teacher.objects.get(id=nid)
        obj.name = name
        obj.cls.set(cls_li)

反向查询

#### book_set是一个query_set,当author表里没有book字段时,用book_set来查询book   
        
#### 自己写第三张表

一对一 : 在一对多的基础上,对多的xxx_id上添加一个unique=ture + Foreignkey
多对多 : 利用两个Foreignkey实现

一对多: 对于book只有一个publisher 外键建在多的一方

    # 一对多关系
    # publisher名字可以自己定义
    # django会自己加一个_id,自己插入的时候也要加id

多对多: 外键可以建在两者中任意一个,ManyToMany会自动创建第三张表

删:

    Book.objects.filter(id=1).delete()

改:

    models.Book.objects.filter(id=3).update(title="PHP")
    ##sql:
    ##UPDATE "app01_book" SET "title" = 'PHP' WHERE "app01_book"."id" = 3; args=('PHP', 3)

查:

    obj = Book.objects.filter(id=4)[0].values("price")

    <1>filter(**kwargs):      它包含了与所给筛选条件相匹配的对象

    <2>all():                 查询所有结果

    <3>get(**kwargs):         返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
    
    book = models.Book.objects.filter(id=2)[0]

    dic = {xx:xx}
    book = models.Book.objects.filter(**dic)

    authors = models.Author.objects.filter(id__gt=2)
    books=models.Book.objects.filter(author__gt=2)
    books=models.Author.objects.filter(id=1).book_set

相关文章

网友评论

      本文标题:Django_ORM CRUD

      本文链接:https://www.haomeiwen.com/subject/bslarxtx.html