zoukankan      html  css  js  c++  java
  • django 外键操作(转载)

    django 外键操作

    看了这篇文章,觉得例子说的很好

    我先定义两个模型,一个是作者,一个是作者出版的书籍,算是一对多的类型。

    class Person(models.Model);
    name = models.CharField('作者姓名', max_length=10)
    age = models.IntegerField('作者年龄')
    class Book(models.Model):
    person = models.ForeignKey(Person, related_name='person_book')
    title = models.CharField('书籍名称', max_length=10)
    pubtime = models.DateField('出版时间')

    如果我们要查询一个作者出版了哪些书籍的话,那我们要怎么做呢?

    先查询到作者的信息

    person = Person.objects.fiter(你的条件)
    返回一个person对象

    接下来就查询person关联的所有书籍对象

    book = person.book_set.all()

    django 默认每个主表的对象都有一个是外键的属性,可以通过它来查询到所有属于主表的子表的信息。

    这个属性的名称默认是以子表的名称小写加上_set()来表示,默认返回的是一个querydict对象,你可以继续的根据情况来查询等操作。

    如果你觉得上面的定义比较麻烦的话,你也可以在定义主表的外键的时候,给这个外键定义好一个名称。要用**related_name**

    比如:

    person = models.ForeignKey(Person, related_name='person_set')
    
    那么上面的话:book = person.book_set.all()
    也可以用book = person.person_set.all()

    上面的是查询是通过主表来查询子表的信。

    下面我简单的说下通过子表来查询主表的信息。

    假设我要查询一本书籍所关联的作者的信息,那我可以通过下面的步骤来实现:

    假如我先得到了一个子表的对象。那我只要获取该对象关联主表的外键的熟悉,就可以得到主表的信息了。

    比如我得到一个book对象,然后我想得到book对象的主表person的信息的话:

    p = book.person

    我个人感觉person有点像指针,存储着person主表对象的地址,呵呵!不过python没有指针这个概念,这是我觉的更好理解。

    讲解多对多

    1、一对多(外键)

    例子:一个作者对应多本书,一本书只有一个作者

    model代码:

    class  Person(models.Model):
    name  =  models.CharField( '作者姓名' , max_length= 10 )  
    age  =  models.IntegerField( '作者年龄' )  
      
    class  Book(models.Model):  
    person  =  models.ForeignKey(Person,  related_name= 'person_book' )  
    title  =  models.CharField( '书籍名称' , max_length= 10 )  
    pubtime  =  models.DateField( '出版时间' )

    (一)获取对象方法:

    1.从作者出发获取书籍

    person = Person.objects.fiter(你的条件)
    book = person.book_set.all()

    2.从书籍出发获取作者

    p = book.person

    例子:一个作者对应多本书,一本书有多个作者

    model代码:

    class  Author(models.Model):    
        first_name  =  models.CharField(max_length= 30 )    
        last_name  =  models.CharField(max_length= 40 )    
        email = models.EmailField()
    
            
    class  Book(models.Model):    
        title  =  models.CharField(max_length= 200 )    
        authors = models.ManyToManyField(Author)

    (一)获取对象方法:

    1.从书籍出发获取作者

    b = Book.objects.get(id= 50 )  
    b.authors.all()  
    b.authors.filter(first_name= 'Adam' )

    2.从作者出发获取书籍

    a = Author.objects.get(id= 1 )  
    a.book_set.all()

    (二)添加对象方法:

    a = Author.objects.get(id= 1 )  
    b  =  Book.objects.get(id= 50 )  
    b.authors.add(a)

    (三)删除对象对象方法:

    a = Author.objects.get(id= 1 )  
    b  =  Book.objects.get(id= 50 )  
    b.authors.remove(a)  
    或者 
    b.authors.filter(id= 1 ).delete()
  • 相关阅读:
    为了实现在线库的复杂查询,你还在双写吗?
    双11核心系统100%上云 !阿里数据库处理峰值远超传统厂商
    每秒8700万次!双11数据库峰值新纪录背后的关键力量
    最强CP!阿里云联手支付宝小程序如何助力双11?
    .net IAsyncResult 异步操作
    .net Reflection(反射)- 二
    .net Reflection(反射)- 一
    .net 空接合操作符 ??
    .net 基元类型,引用类型和值类型
    .net List<T>
  • 原文地址:https://www.cnblogs.com/master-road/p/11087045.html
Copyright © 2011-2022 走看看