Django-6-model-表关系

  1. 表关系

     一对多:models.ForeignKey(其他表)
     多对多:models.ManyToManyField(其他表)
     一对一:models.OneToOneField(其他表)
    
  2. user_base 代表 user 对象

一、一对一关系

  1. 创建关系

     # models.py
     class User(models.Model):
         telephone=models.CharField(max_length=30,unique=True)
         password=models.CharField(max_length=64)
     
     class UserInfo(models.Model):
         id=models.AutoField(auto_created=True,primary_key=True,serialize=False,verbose_name='ID')
         name=models.CharField(null=False,max_length=255)
         user_base=models.OneToOneField('User',on_delete=models.CASCADE) # 一对一关系
    
  2. 插入数据

     # views.py
     def one_to_one(request):
         # 1. add userinfo
         user01 = models.User.objects.filter(id=1).first()
         userinfo01 = models.UserInfo(name='Sherlock')
         userinfo01.user_base = user01
         userinfo01.save()
         return HttpResponse('SUCCESS')
    
  3. 查询数据

     # view.py
     def query(request):
         # 1. one_to_one
         # 从 --> 主 (正向查询)
         info = models.UserInfo.objects.filter(name='Sherlock').values('name','user_base__telephone','user_base__password')
         print(info)
         # 
         return HttpResponse('user...query...')
     
         # 或者
         info = models.UserInfo.objects.filter(name='Sherlock').first()
         user = info.user_base
         print(user.telephone)
         return HttpResponse('user...query...')
     
         # 主 --> 从 (逆向查询)
         user = models.User.objects.filter(telephone='13512345678').values('telephone','userinfo__name')
         print(user)
         return HttpResponse('user...query...')
    

二、一对多关系

  1. 创建关系

     # models.py
     class User(models.Model):
         telephone=models.CharField(max_length=30,unique=True)
         password=models.CharField(max_length=64)
     
     class Address(models.Model):
         id=models.AutoField(auto_created=True,primary_key=True,serialize=False,verbose_name='ID')
         place=models.CharField(null=False,max_length=255)
         user_base=models.ForeignKey(to='User',to_field='id',default=1,on_delete=models.CASCADE) # 一对多关系
    
  2. 插入数据

     # views.py
     def one_to_many(request):
         # 2. add address
         user01 = models.User.objects.filter(id=1).first()
         addr = models.Address(place='贝尔街_B122')
         addr.user_base = user01
         addr.save()
         return HttpResponse('SUCCESS')
    
  3. 查询数据

     # view.py
     def query(request):
         # 2. one_to_many
         # 从 --> 主 (正向查询)
         addr01 = models.Address.objects.filter(place='贝尔街_B122').values('user_base__telephone','place','user_base__userinfo__name')
         print(addr01)
            
         # 主 --> 从 (逆向查询)
         user01 = models.User.objects.filter(id=1).values('telephone','userinfo__name','address__place')
         print(user01)
    
         # __set,某个人的地址的集合
         user01 = models.User.objects.filter(id=1).first()
         print(user01.address_set.all().values())
         # 
    

三、多对多关系(django orm自动创建)

多对多关系自动创建一个表

  1. 创建关系

     # models.py
     class User(models.Model):
         telephone=models.CharField(max_length=30,unique=True)
         password=models.CharField(max_length=64)
     
     class Disposition(models.Model):
         name = models.CharField(max_length=30, unique=True)
         user_base = models.ManyToManyField('User') # 多对多关系
    
  2. 插入数据

     # views.py
     def many_to_many(request):
         # 3. add disposition_pos_user
         user01 = models.User.objects.filter(id=1).first()
         pos = models.Disposition.objects.filter(id=2).first()
         pos.user_base.add(user01)
         return HttpResponse('SUCCESS')
    
  3. 查询数据

     # view.py
     def query(request):
         # 3. many_to_many
         pos = models.Disposition.objects.filter(name='开朗').values('name','user_base__telephone','user_base__id')
         print(pos)
     
         user = models.User.objects.filter(id=1).values('telephone','disposition__name')
         print(user)
    

四、多对多关系(手动创建)

自己创建多对多关系表

  1. 创建关系

     # models.py
     class User(models.Model):
         telephone=models.CharField(max_length=30,unique=True)
         password=models.CharField(max_length=64)
     
     class Hobby(models.Model):
         name = models.CharField(max_length=30, unique=True)
     
     class UserHobby(models.Model):
         uobj = models.ForeignKey(to='User',to_field='id',default=1,on_delete=models.CASCADE)
         hobj = models.ForeignKey(to='Hobby',to_field='id',default=1,on_delete=models.CASCADE)
         pub_time = models.DateTimeField(auto_now_add=True)
    
  2. 插入数据

     # 好像无法操作。。。有人说这种方法“无法通过orm跨表查询(不要使用)”,不过经检验可以。。。
    
  3. 查询数据

     # view.py
     def query(request):
         # 4. hobby :自己创建多对多
         hobs = models.User.objects.filter(id=1).values('telephone','userhobby__hobj__name')
         print(hobs)
    
         rel = models.UserHobby.objects.all().values('uobj__telephone','hobj__name')
         print(rel)
    

你可能感兴趣的:(Django)