python—Django模型类多表操作(一对多,多对多,自关联)

6 篇文章 0 订阅
4 篇文章 0 订阅

先看看一对多的操作: 

from django.db import models

# Create your models here.
class User(models.Model):
    username = models.CharField(max_length=16)
    password = models.CharField(max_length=16)

class User2(models.Model):
    username = models.CharField(max_length=16)

#发帖的帖子表
class News(models.Model):
    topic = models.CharField(max_length=100)
    #一方删除另一方也跟着删除,在这个定义一对多的外键,to '一'的一方
    sender = models.ForeignKey(to=User2,on_delete=models.CASCADE)

下面的操作在Treminal中进行更直观:先进入交互模式:python manage.py shell进行下面的操作,exit()结束

我是在.py文件中执行的,复制manage.py文件,创建新文件把下面的内容粘贴在最下面

   from user.models import *
    #实例化User对象
    user = User2()
    #复值
    user.username = 'name1'
    #保存
    user.save()

    news = News()
    news.topic = 'topicl'
    #sende定义了指向发送者的对象
    news.sender = user
    news.save()

    #查看发送者
    print(news.sender.username)

    #查看所有的所有帖子
    #在这里可以用类名小写+ _set.all()查看
    print(user.news_set.all())#这里返回的是一个object对象
    #看第一个
    print(user.news_set.all()[0].topic)


#返回值
name1
<QuerySet [<News: News object (2)>]>
topicl

现在看看多对多的操作:

from django.db import models

# Create your models here.
class User(models.Model):
    username = models.CharField(max_length=16)
    password = models.CharField(max_length=16)

#用户
class User2(models.Model):
    username = models.CharField(max_length=16)

#发帖的帖子表
class News(models.Model):
    topic = models.CharField(max_length=100)
    #一方删除另一方也跟着删除
    # sender = models.ForeignKey(to=User2,on_delete=models.CASCADE)
    # related_name='sender_set'方便User2寻找,在这个定义一对多的外键,to '一'的一方
    sender = models.ForeignKey(to=User2,on_delete=models.CASCADE,related_name='sender_set')
   #定义多对多的操作
    collectors = models.ManyToManyField(to=User2,related_name='collectors_set')#
  from user.models import *
    #得到对象
    news = News.objects.get(id=1)
    user = User2.objects.get(id=1)

    #设置user收藏了 news
    user.collectors_set.add(news)
    user.save()

    #查看user 收藏了哪些帖子
    print(user.collectors_set.all())
    #查看所有收藏了自己的用户
    news.collectors.all()

    user2 = User2()
    user2.username = 'name2'
    user2.save()
    #通过news添加收藏的他的user对象
    news.collectors.add(user2)
    news.save()

    news.topic
    #查看收藏了这个帖子的用户
    news.collectors.all()
    #刚刚有这个查看,因为我们添加了related_name='sender_set'所以不能使用user.news_set.all()
    
    #必须使用user.sender_set()
    user.sender_set()

自关联:

#自关联
class Area(models.Model):
    name = models.CharField(max_length=10)
    #表示父级地区
    pArea = models.ForeignKey(to='self',null=True,on_delete=models.CASCADE)
    from  user.models import Area
    area = Area()
    area.name = 'beijing'
    area.save()

    area2 = Area()
    area2.name = 'chaoyang'
    #chaoyang 的父级地区应该是beijing,所以pArea指向area
    area2.pArea = area
    area2.save()
    #查看子地区
    area.area_set.all()
    #得到北京下的第一个子地区
    print(area.area_set.all()[0].name)

    #得到北京
    area2.pArea
    print(area2.pArea.name)



#####输出####
#chaoyang
#beijing
############

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值