先看看一对多的操作:
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
############