基于MySQL,django默认的sqlite没有外键约束效果
自关联 - - 基于Forenkey,创建model类如下:
# 定义一个评论类--基于Forenkey的自关联
class Appreciation(models.Model):
newId = models.IntegerField() # 文章的ID
content = models.CharField(max_length=100) # 评论的內蓉
user = models.CharField(max_length=32) # 评论的用户
# 评论ID,有值的话表示回复某条评论
reply = models.ForeignKey("Appreciation",null=True,blank=True)
# contents = models.Appreciation.objects.values()
# print(contents)
# models.Appreciation.objects.create(newId=1,content='content1',user='usera')
# models.Appreciation.objects.create(newId=1,content='content2',user='userb')
# 插入一条评论1的回复(评论1已经存在)
# models.Appreciation.objects.create(newId=1,content='content3',user='userc',reply_id=1)
# 插入一条评论5的回复(评论5不存在)--报错,外键约束
# models.Appreciation.objects.create(newId=1,content='content3',user='userc',reply_id=5)
# 再插入一条评论1的回复
# models.Appreciation.objects.create(newId=1,content='content4',user='userd',reply_id=1)
# 插入一条评论3的回复(content3的回复,content3是content1的回复)
# models.Appreciation.objects.create(newId=1,content='reply content3',user='usere',reply_id=3)
# 查询评论1的所有回复
# cont1 = models.Appreciation.objects.filter(reply_id=1).values()
# for row in cont1:
# print(row)
自关联 -- 基于ManyToMany
class User(models.Model):
name = models.CharField(max_length=32)
gender_choices = (
(1,'男'),
(2,'女')
)
gender = models.IntegerField(choices=gender_choices)
# 创建一个m2m自关联字段,related_name属性作用:反向查询用“Girl”替换“表名_set"的用法
# 会生成一张关系表 -- 字段为:id from_user_id to_user_id
boyToGirl = models.ManyToManyField("User",related_name="GirlToBoy")
# 给user表添加数据
# users = [
# models.User(name="genie",gender=1),
# models.User(name="weizhuang",gender=1),
# models.User(name="baifeng",gender=1),
# models.User(name="honglian",gender=2),
# models.User(name="nongyu",gender=2),
# models.User(name="duanmu",gender=2),
# ]
# models.User.objects.bulk_create(users)
for row in models.User.objects.values():
print(row)
# 给关系表添加数据 -- 自定义规则:from_user_id字段为男字段,to_user_id为女字段
# genie = models.User.objects.filter(id=1).first()
# genie.boyToGirl.add(4,5,6)
# 以上为给genie用户绑定关系,有关系的人为:4,5,6
# 查询与genie(男:依赖于from_user_id)有关系的人
genie = models.User.objects.filter(id=1).first() # 先拿到genie对象
rel_person = genie.boyToGirl.all()
for row in rel_person:
print(row.name)
# 查询nongyu(女:依赖于to_user_id)有关系的人
nongyu = models.User.objects.filter(id=5).first()
rel_person = nongyu.GirlToBoy.all()
for row in rel_person:
print(row.name)