• 十二 .Django ForeighKey自关联(ORM)


    一. ForeighKey自关联(ORM)

    1. foreign key自关联 ,正向查找,反向查找

    class UserInfo(models.Mode):
        username=models.CharField(max_length=32)
        password=models.CharField(max_length=32)
        gender_list=(
              (1,''),
              (2,''),
        )
        gender=models.IntegerField(choices=gender_list)
       
    class U2U(models.Model):
        利用一张表创建出 男生对应约会女生的关系表,但是这个需要从程序层面维护,直接插入男对男的约会,数据库也不知道这是一张男女约会的关系表。
        g=models.ForeignKey('UserInfo',related_name='boys')
        b=models.ForeignKey('UserInfo',related_name='girl')





    
    

    2. foreign key自关联 ,正向查找,反向查找

    class UserInfo(models.Model):
    
      username=models.CharField(max_length=32)
    
      gender_list=(
    
        (1,''), 
    
        (2,''),
     )
    
     gender=models.IntegerField(choices=gender_list)
    
        m=models.ManyToMany('UserInfo')

    
    
    class UserInfo(models.Model):
        name=models.CharField(max_length=32)
        gender_list=(
            (1,''),
            (2,''),
        )
        gender=models.IntegerField(choices=gender_list)
        m=models.ManyToManyField('UserInfo') #这里会生成另一个表叫 userinfo_m ,里面的是字段是from_userinfo_id   
    to_userinfo_id ,这两个字段便是男生与女生的相亲关系,至于会不会男生和男生相亲,这个需要从程序层面避免,因为数据库只1 和 2 ,而1 和1 这样的数据,数据库不会分辨
    views.py 创建数据记录:
    
    def test(request):
        '''数据库数据创建'''
        # models.UserInfo.objects.create(name='liang1',gender=1)
        # models.UserInfo.objects.create(name='liang2',gender=1)
        # models.UserInfo.objects.create(name='liang2',gender=1)
        # models.UserInfo.objects.create(name='lili1',gender=2)
        # models.UserInfo.objects.create(name='lili2',gender=2)
        # models.UserInfo.objects.create(name='lili3',gender=2)
    正向查找:查询数据男生liang1 相亲过的女生:  

    #
    正向查找: boyret=models.UserInfo.objects.filter(name='liang1').first() print(boyret,'boyret--------') boyret1=boyret.m.all() #通过本表的外键查询到的是 UserInfo object,如果是all() 那就是<QuerySet [<UserInfo: UserInfo object>, <UserInfo: UserInfo object>, <UserInfo: UserInfo object>]> for row1 in boyret1: print(row1.name) #找到与之关联的女生的名字
    反向查询数据:查询 女生lili3 相亲过的男生记录:
       
     #反向查找
        result=models.UserInfo.objects.filter(name='lili3').first()
        # result.m.add(4)
        result1=result.userinfo_set.all()  #通过女生的名字,查询到女生这一条记录,通过表名的小写 userinfo_set.all() 查询到这个女生的所有数据,再用for循环取到男生名字
        for row in result1:
            print(row.name)

     3. 阔展BBS

    扩展:∆ 在BBS中,数据库的记录:foreign key 自关联
    
    root 用户发布了一则话题 ‘别比比’  自增ID为1 ,没有人回复reply_id 为null , xxxxx用户回复了 自增ID为2 的记录,回复了一条‘拉倒吧1’
    class Comment(models.Model): #ForeignKye 的自关联
        news_id=models.IntegerField() #新闻ID
        content=models.CharField(max_length=32)  #评论内容
        user=models.CharField(max_length=32) #评论者
        replay=models.ForeignKey('Comment',null=True,blank=True,related_name='xx') #回复这个内容的ID是哪个
    
        '''
       自增id     news_id     content            user       reply_id
            1          钓鱼岛是中国的        root          null    # root 用户评论了 新闻 ID 为 1 ,评论内容是'钓鱼岛是中国的’ ,(reply_id)没有人回复root 
            1          就是要这样...            root           null  # 
            1           就是                admin          null .  #admin 用户评论 新闻 ID 为  1 ,评论内容是 ‘就是’,没有人回复
            2           不评论              zhangsan        null   
            1           说的对              guest          2    #guest用户 回复 的新闻ID 为 1 ,回复的是 2 的自增id ,内容是‘说的对’
            1           很好                guest2         2 
        '''
    如:
    新闻ID 1 : 钓鱼岛新闻:XXXXXXXXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    ----------- 评论:---------
       root: 钓鱼岛是中国的
       root: 就是要这样....
         来自 guest 回复:说得对
         来自guest2回复:很好
    新闻ID2: 中国人民的GDP
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    -----------评论:------------
      zhangsan: 不评论。
      目前没人回复此评论。
     values()取值 与 values_list() 取值,问: 两个表(一个用户表,一个部门表),用户表里的外键关联着部门,要从部门表获取到用户的名字?
    用三个方法获取到用户表的用户的名字:
    方法一:直接反向查询用户结果
    def index(request): result=models.DepartMent.objects.filter(dname='销售').first() v=result.userinfo_set.all() li=[] for row in v: li.append(row.name) return HttpResponse(li,)
    方法二:反向查询结果为字典格式:values() #取值,取到的是字典 
    
    复制代码
    def two(request):
        result=models.DepartMent.objects.all().values(‘dname’,’userinfo__id’,’userinfo__name’)#∆备注拿到的是字典,因为拿到的是’部门’的all()结果,所以会有一个None在。。。。。
     print(result)
        li=[]
        for item in result:
            print(item['userinfo__name'])
            print(item['userinfo__id'])
           # li.append(item['userinfo__name'])
           # li.append(item['dname'])
        print(li)
        return HttpResponse(li)
    
    ∆备注:不要拿到None是result=models.DepartMent.objects.filter(dname=‘销售’).values(‘dname','userinfo__id','userinfo__name')#拿到的是字典,因为拿到的是'部门'的‘销售‘,这时就没有None 了
    方法三:反向查询结果为元组格式:values_list()取值  ,取到的是元组
    
    复制代码
    使用values_list() ,取到的是元组值(1, 'tony')
    3】[(1,tonh),(2,django)] 元组类型取值
    Models.UserInfo.objects.all().values_list(‘id’,’name’)
    
    def three(request):
        result=models.DepartMent.objects.filter(dname='销售').values_list('userinfo__id','userinfo__name')#拿到的是元组
        for item in result:
            print(item[0])
        return HttpResponse(result)
  • 相关阅读:
    CF704D Captain America 上下界网络流
    CF241E Flights 差分约束
    CF1063F String Journey DP、SAM、线段树
    AGC028E High Elements 贪心、DP、线段树
    Solution -「CF 623E」Transforming Sequence
    Solution -「十二省联考2019」春节十二响
    最大团-最小度不等式
    「Lagrange 插值」学习笔记
    Solution -「NOI.AC 省选膜你赛」union
    Solution -「NOI.AC 省选膜你赛」T2
  • 原文地址:https://www.cnblogs.com/lovershowtime/p/11369283.html
Copyright © 2020-2023  润新知