Django数据库一对一 一对多 多对多

one2one:model数据字段,最重要的就是设置外键 这个
# 联系人作为主表
class PersonModel(models.Model):

    name = models.CharField(max_length=20, verbose_name='姓名')
    phone = models.CharField(max_length=15, verbose_name='手机号')

    class Meta:
        db_table = 'person'

class AccountModel(models.Model):

    # 一个账户对应一个联系人
    # models.CASCADE,当主表中的数据被删除时,从表数据一块删除
~~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    person = models.OneToOneField(PersonModel, on_delete=models.CASCADE)【在这列设置的外键,外间的关键词OneToOneField】
~~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    username = models.CharField(max_length=20, verbose_name='用户名')
    address = models.CharField(max_length=50, verbose_name='地址')

    class Meta:
        db_table = 'account'    

one2one:添加!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
创建models中的数据类的对象
主表:
person = PersonModel()
person.name = ‘赋予的值’
person.phone = ‘赋予的值’
person.save()
从表:
account = AccountModel()
account.person = person[这里的’acount.person‘(这里的person就是model从表中设置的外键)属性对应的就是主表的一个对象]
account.username = 'www'
    account.address = 'wwwww'
    account.save()
one2one:查询!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
person = PersonModel.objects.get(id=3)
account = person.accountmodel(是根据person在AccountModel中对应的一条数据)
以上写法等同于这个:account = AccountModel.objects.get(person=person)
某个属性的值就是   account.username   account.address

 account = AccountModel.objects.get(id=2)   找到account对象
某个属性的值就是   account.username   account.address

 知道某张表中的某个条件,查询另外一张表中的所有数据
    # person = PersonModel.objects.get(name='www')
    # print(person.accountmodel.username)
    # print(person.accountmodel.address)

person__name利用person表中name字段,查询account表中的数据
  account = AccountModel.objects.get(person__phone='110')
print(account.username)

{person = PersonModel.objects.get(accountmodel__username='qq')
    print(person.phone)
}这个accountmodel是大写还是小写
one2one:删除
主表中的数据被删除后,从表数据一并删除
PersonModel.objects.get(id=2).delete()
account = AccountModel.objects.get(id=4)
修改从中的person属性值,person值必须是person表中的一条没有被关联的数据
 # account.person =


one2many
# 一对多
# 一个老师 对应多个学生
# 一个班级 对应多个学生
# 一个用户 对应多个收货地址
class ClassRoom(models.Model):

    class_name = models.CharField(max_length=20, verbose_name='教室名称')
    class_addr = models.CharField(max_length=20, verbose_name='教室地址')

class Teacher(models.Model):
    name = models.CharField(max_length=20, verbose_name='教师名称')

class Student(models.Model):

   #### ######## ForeignKey 设置外键
    class_room = models.ForeignKey(ClassRoom, on_delete=models.CASCADE)
    # ############可以设置多个外键
    teacther = models.ForeignKey(Teacher, on_delete=models.CASCADE)

    name = models.CharField(max_length=10, verbose_name='学生姓名')
    phone = models.CharField(max_length=20, verbose_name='学生电话')

添加还是创建对象,对象点属性等于一个值,然后就是对象点save()
class_room = ClassRoom()
class_room.class_name = 'python12'
class_room.class_addr = '315'
class_room.save()
找到ClassRoom表格id=6的对象
class_room = ClassRoom.objects.get(id=6)
stu = Student()
stu.class_room = class_room【这个class_room 就是 ClassRoom.objects.get(id=6),也就是ClassRoom的一个对象,stu.class_room这个是 Student()的一个属性 stu是Student()对象   】
【一对多的,多的那个类(Student)的对象(stu )中的,属性就是一的对象(class_room = ClassRoom.objects.get(id=6))这个属性就是在model中设置外间的那个属性】
stu.name = 'ssss'
stu.phone = '1110'
stu.save()

one2many  查询
class_room = ClassRoom.objects.get(id=6)
class_room.class_name,     class_room.class_addr

2.根据主表数据查询从表数据
student_set从表中的数据集合{这个从表中的数据集合是什么意思 ????????????????}
stus = class_room.student_set.all()
stus = Student.objects.filter(class_room = class_room)

# 3.根据从表数据查询主表数据
    # stu = Student.objects.get(name='lisi')
####    ##### class_room ,就是主表中对应的数据模型对象
    # print(stu.class_room.class_name)
class_room = ClassRoom.objects.get(student__name__contains='lisi')
  print(class_room.class_name)


   # 删除主表中的数据,从表中关联的数据一并删除
    # ClassRoom.objects.get(id=6).delete()

    # 删除从表中的数据
    # Student.objects.get(id=1).delete()

    return HttpResponse('delete ok')

 


# 学徒
# 新闻出版社  文章
# 一个出版社对应多篇文章
# 一篇文章对应多个出版社

class Publication(models.Model):

    name = models.CharField(max_length=20, verbose_name='出版社')
    addr = models.CharField(max_length=20, verbose_name='地址')

    class Meta:
        db_table = 'publication'


class Article(models.Model):

    title = models.CharField(max_length=50, verbose_name='标题')
    author = models.CharField(max_length=50, verbose_name='作者')
    content = models.CharField(max_length=50, verbose_name='内容')
    # ManyToManyField 多对多
    pub = models.ManyToManyField(Publication ,verbose_name='出版社')

    class Meta:
        db_table = 'article'

# pub = Publication()
    #     # pub.name = 'qqqqqq'
    #     # pub.addr = '北京'
    #     # pub.save()
    #
    # article = Article()
    # article.title = '3寻找!'
    # article.author = '凤凰'
    # article.content = '寻找!'
    # article.save()
{


pub = Publication.objects.get(id=1)
# pub2 = Publication.objects.get(id=2)
    # article2 = Article.objects.get(id=2)
    # article3 = Article.objects.get(id=3)
不管是一对一还是一对多,从表对象.关系字段 = 主表数据对象
多对多关系
    # article.pub 是一个数据集合
 article.pub.all()
 article2.pub = {pub}
  # article2.save()

# article3.pub = {pub}
    # article3.save()
    # print(article.pub.all())

 article = Article.objects.get(id=1)
    pub = Publication.objects.get(id=2)
    # article.pub.add(pub)
    article.pub = {1, 2, 3}
    # article.pub.add(3)
    article.save()
{这里的没有了理解  # article.pub 是一个数据集合 }
}
# 1.删除表数据之间的关联
    # 2.删除表中的数据
    # Publication.objects.get(id=1).delete()

    # 1.删除表数据之间的关联
    # 2.删除表中的数据
    Article.objects.get(id=1).delete()

 pub = Publication.objects.get(id=1)
    # 获取主表对应的所有从表数据
    # article_set数据集合
    # print(pub.article_set.all())

    article = Article.objects.get(id=1)
    # 获取从表对应主表信息
    # article.pub 数据集合
    print(article.pub.all())

url中的参数   第一个 正则表达式 路由   第二个就是

视图函数   第三个name 就是反向解析名前台{% url ‘name’%}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值