django ORM 连表查询

db_index=True  如果设置该字段就可以设置索引

auto_now_add  代表设置创建时候的时间

auto_now   每次更新数据记录时会更新该字段

 

to_field 设置要关联表的字段,一般是ID

related_time 反向操作时,使用的字段名,用于代替原反向查询时的表名_set

class Classes(models.Model):
    name = models.CharField(max_length=32)

class Student(models.Model):
    name = models.CharField(max_length=32)
    theclass = models.ForeignKey(to="Classes")

反向查询时:
models.Classes.objects.first().student_set.all()
才可以查询

但如果在ForeignKey字段中添加了参数related_name后

class Student(models.Model):
    name = models.CharField(max_length=32)
    theclass = models.ForeignKey(to="Classes", related_name="students"
如上所示

我们就可以这么写了,记得加s

models.Classes.objects.first().students.all()

 

db_table 创建第三张表时,数据库中表的名称

symmetrical 仅用于多对多自关联时,指定内部是否创建反向操作的字段,默认为True

class Person(models.Model):
    name = models.CharField(max_length=16)
    friends = models.ManyToManyField("self", symmetrical=False)
此时person对象就没有person_set这个属性了




创建多对多关联关系的三种方式:

方式一:自行创建第三张表:

class Author2Book(models.Model):
    author = models.ForeignKey(to="Author")
    book = models.ForeignKey(to="Book")

    class Meta:
        unique_together = ("author", "book")

 方式二:通过ManytoManyField 自动创建第三张表


方式三:设置ManyTomanyField并指定自行创建的第三张表

应用场合:在第三表需要额外的字段的时候,就用方式三

方式三:设置ManyTomanyField并指定自行创建的第三张表

反向操作:对象查找 obj.表名_set               表名记得是小写

 

关联管理器 是在一对多,或者多对多的关联上下文中使用的管理器:

它存在于下面两种情况:

1.外键关系的反向查询

2.多对多关联关系

创建一个新的对象,并把他添加到关联对象集之中,返回新创建的对象

create()

models.Author.objects.first().book_set.create(title="番茄物语")

add()

把指定的model对象添加到关联对象集中

author_objs = models.Author.objects.filter(id__lt=3)

models.Book.objects.first().authors.add(*author_objs)

 

添加ID:

models.Book.objects.first().authors.add(1,2)

把书的第一个对象的外键关联对象增加id为1,2的作者

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 





 

转载于:https://www.cnblogs.com/zhaoweihang/p/9209472.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值