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')    
  • 相关阅读:
    五秒原则,做一件事之前数 5 秒,1,2,3,4,5 立马去做。比如睡觉:数五秒,立马放下手机,闭眼。
    Perl 安装 JSON 包
    Perl: hash散列转换为Json报错集, perl.c,v $$Revision: 4.0.1.8 $$Date: 1993/02/05 19:39:30 $
    叫法: 表名 表字段名 定义每个表字段
    失误1: 把i放到循环体内部,i++失效
    沈南鹏@《遇见大咖》: A轮没投,投了8个月以后就证明了张一鸣是对了,在美国都没有张一鸣这种模式
    xshell通过xftp传输Windows文件到Linux:在输入put后,再摁 TAB 键,可显示当前文件夹的文件
    LeetCode84 Largest Rectangle in Histogram
    全排列问题及其引申问题
    LeetCode Weekly Contest 8
  • 原文地址:https://www.cnblogs.com/fengjian2016/p/5377234.html
Copyright © 2011-2022 走看看