zoukankan      html  css  js  c++  java
  • django的多对一,一对一,多对多关系

    from django.db import models
    
    class Publisher(models.Model):
        name = models.CharField(max_length=30)
        address = models.CharField(max_length=50)
        city = models.CharField(max_length=60)
        state_province = models.CharField(max_length=30)
        country = models.CharField(max_length=50)
        website = models.URLField()
    
        def __unicode__(self):
            return self.name
    
    class Author(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=40)
        email = models.EmailField()
    
        def __unicode__(self):
            return u'%s %s' % (self.first_name, self.last_name)
    
    class Book(models.Model):
        title = models.CharField(max_length=100)
        authors = models.ManyToManyField(Author)
        publisher = models.ForeignKey(Publisher)
        publication_date = models.DateField()
    
        def __unicode__(self):
            return self.title

    获取数据库对象的特定字段的值只需直接使用属性。例如,要确定ID为50的书本的标题,需要这样做:
    from mysite.books.models import Book
    b=Book.objects.get(id=50)
    b.title
    u'The Django Book'

    外键ForeignKey或ManyToManyField的关联对象字段
    访问外键的值,外键就是一对多的关系,可以形象的比喻为一本书可以被多个出版社出版,可以使用如下的执行语句
    b=Book.objects.get(id=50)
    b.publisher
    <Publisher:Apress Publishing>
    b.publisher.website
    u'http://www.apress.com/'
    上面的查询语句可以理解成,得到一本书的对象之后,因为他是由出版社出版的,所以书上也会印上出版社基本的信息,表明这本书是这个出版社出版的。所以可以用b.publisher.website
    对于用“ForeignKey”来定义的关系来说;在关系的另一端也能反向的追溯回来,只不过由于不对称性的关系而稍有不同。注意:不对称的关系。通过一个"publisher"对象,直接获取books,用
    publisher.book_set.all().可以这样理解,出版社有所有的书的对象,可以使用出版社对象查到该书的所有的信息
    p=Publisher.objects.get(name="Apress Publishing")
    p.book_set.all()
    [<Book:The Django Book>,<Book:Dive Into Python>,...]
    实际上,book_set只是一个QuerySet,所以它可以像QuerySet一样,能实现数据过滤和分切,例如:
    p=Publisher.objects.get(name="Apress publishing")
    p.book_set.filter(name_icontains="django")
    [<Book:The Django Book>,<Book:Pro Django>]
    属性名称book_set是由模型名称的小写(如book)加_set组成的
    上面的语句可以理解成一个出版社对象,这个出版社里面所有含有django名字的书
    多对多可以理解成一本书可以有多个作者,一个作者可以写多个书,多对多和外键工作方式相同,只不过我们处理的是QuerySet而不是模型实例。例如,这里是如何查看书籍的作者:
    b=Book.objects.get(id=50)
    b.authors.all()
    [<Author:Adrian Holovaty>,<Author:Jacob Kaplab-Moss>]
    上面的语句可以理解成可以根本一本书来得到所有的作者名,然后下面的语句再过滤
    b.authors.filter(first_name="Adrian")
    [<Author:Adrian Holovaty>]
    b.authors.filter(first_name="Adam")
    []
    反向查询也可以。要查看一个作者所有的书籍,使用author.book_set,就像下面这样:
    a=Author.objects.get(first_name="Adrian",last_name="Holovaty")
    a.book_set.all()
    [<Book:The Django Book>,<Book:Adrian's Other Book>]
    就像使用ForeignKey字段一样,属性名book_set是在数据模型(model)名后追加_set

    参照:http://blog.163.com/soyking@126/blog/static/162125251201310211148544/
  • 相关阅读:
    mysql索引
    springboot mybatis 后台框架平台 shiro 权限 集成代码生成器
    java 企业网站源码模版 有前后台 springmvc SSM 生成静态化
    java springMVC SSM 操作日志 4级别联动 文件管理 头像编辑 shiro redis
    activiti工作流的web流程设计器整合视频教程 SSM和独立部署
    .Net Core中的ObjectPool
    文件操作、流相关类梳理
    .Net Core中的配置文件源码解析
    .Net Core中依赖注入服务使用总结
    消息中间件RabbitMQ(一)
  • 原文地址:https://www.cnblogs.com/yingqml/p/6576557.html
Copyright © 2011-2022 走看看