zoukankan      html  css  js  c++  java
  • 一对多 多对多表查询

    经典的例子:一本书有多个作者,一个作者有多本书,典型的多对多关系。

    设计模型如下:

    view plaincopy to clipboardprint?
    01.from django.db import models  
    02.  
    03.class Author(models.Model):  
    04.    first_name = models.CharField(max_length=30)  
    05.    last_name = models.CharField(max_length=40)  
    06.    email = models.EmailField()  
    07.      
    08.    def __unicode__(self):  
    09.        return self.name  
    10.      
    11.    class Meta:  
    12.        db_table = "author"       
    13.      
    14.class Book(models.Model):  
    15.    title = models.CharField(max_length=200)  
    16.    authors = models.ManyToManyField(Author)  
    17.      
    18.    def __unicode__(self):  
    19.        return self.title  
    20.      
    21.    class Meta:  
    22.        db_table = "book"    

    访问多值:

    一本书的所有作者:

    b = Book.objects.get(id=50)

    b.authors.all()

    b.authors.filter(first_name='Adam')

    反向也可以,一个作者的所有书:

    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()

    一对多关系 = 外键
    
    用户组表
    
    1. ATG
    2. dragon
    3. OA
    4. SAP
    
    
    主机信息表
    
    c1pd001    1.1.1.1     1(ATG)
    c1pd002    1.1.1.2     2(ATG)
    c1pd003    1.1.1.3     3(ATG)
    c1pd004    1.1.1.4     4(ATG)
    
    原生sql
        insert into  asset values(hostname='c1pd005',ip='1.1.1.5',groupid=1)
    
    django
        1.获取用户表对象
        2.插入主机表
        
        groupid = models.UserGroup.object.get(id=groupId)
        models.asset.object.create(username=username,password=password,user_group=groupid)
        
    跨表查询
        obj = models.asset.object.filters(user_group__Groupname = '用户组A')
        
    多对多关系
    
    #############表结构############
    class UserInfo(models.Model):
        name = models.CharField(max_length=32)
    
    
    class UserGroup(models.Model):
        caption = models.CharField(max_length=64)
        user_info = models.ManyToManyField('UserInfo')
    ############################################################
    
    从UserGroup表操作,有user_info多对多
    user_info_obj = models.UserInfo.objects.get(name=u'feng')
    group_obj = models.UserGroup.objects.get(caption='CFO')
    
    group_obj.user_info.add(user_info_obj)     # 添加数据
    group_obj.user_info.remove(user_info_obj)  # 删除数据
    
    
    user_info_objs = models.UserInfo.objects.all()
    group_objs = models.UserGroup.objects.all()
    
    group_obj.user_info.add(*user_info_objs)     # 添加数据
    group_obj.user_info.remove(*user_info_objs)
    
    #########################################
    
    从UserInfo表操作
    # 添加数据
    #user_info_obj.usergroup_set.add(group_obj)
    #user_info_obj.usergroup_set.add(*group_objs)
    
     
    
    # 删除数据
    #user_info_obj.usergroup_set.remove(group_obj)
    #user_info_obj.usergroup_set.remove(*group_objs)
    
     
    # 获取数据
    #print group_obj.user_info.all()
    #print group_obj.user_info.all().filter(id=1)
    
    # 获取数据
    #print user_info_obj.usergroup_set.all()
    #print user_info_obj.usergroup_set.all().filter(caption='CEO')
    #print user_info_obj.usergroup_set.all().filter(caption='DBA')    
  • 相关阅读:
    DB2控制中心创建触发器
    将web应用迁到TongWeb
    DB2自增列数据处理
    Android 所有版本区别总结(转)
    C#强制关闭Excel进程(通过COM使用Excel时)
    Web开发中的ContentType类型大全
    Javascript中闭包(Closure)的探索(一)基本概念
    Javascript 中闭包(Closure)的探索(三)私有函数中的this
    VS2008中Web Reference和Service Reference的区别
    ASP.NET中模拟管理员用户提升权限
  • 原文地址:https://www.cnblogs.com/fengjian2016/p/5377234.html
Copyright © 2011-2022 走看看