django 数据库 多表操作

生成表的代码:

from django.db import models

# Create your models here.


class Book(models.Model):
    title=models.CharField(max_length=32,unique=True)
    price=models.DecimalField(max_digits=8,decimal_places=2,null=True)# 999999.99
    pub_date=models.DateTimeField()
    publish=models.ForeignKey(to="Publish",to_field="id",on_delete=models.CASCADE)
#多对多
    authors=models.ManyToManyField(to="Author")

    def __str__(self):
        return self.title

class Publish(models.Model):
    name=models.CharField(max_length=32)
    email=models.CharField(max_length=32)
    addr=models.CharField(max_length=32)


class Author(models.Model):
    name=models.CharField(max_length=32)
    age=models.IntegerField()
  # 外键

ad=models.ForeignKey(to="AuthorDetail",to_field="id",on_delete=models.CASCADE,unique=True)
  #一对一
ad
=models.OneToOneField(to="AuthorDetail",to_field="id",on_delete=models.CASCADE,) def __str__(self): return self.name class AuthorDetail(models.Model): gf=models.CharField(max_length=32) tel=models.CharField(max_length=32)

一对一:

class Author(models.Model):

    nid = models.AutoField(primary_key=True)
    name=models.CharField( max_length=32)
    age=models.IntegerField()

    # 与AuthorDetail建立一对一的关系
    authorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE)

添加数据:

先添加关联的表信息,在添加被关联表的信息:

a1=AuthorDetail.objects.create(gf=gf,tel=tel) #关联表
Author.objects.create(name=name, age=age,authorDetail=a1) #被关联表

一对多

方式1:
   publish_obj=Publish.objects.get(nid=1)
   book_obj=Book.objects.create(title="金瓶眉",publishDate="2012-12-12",price=100,publish=publish_obj)
  
方式2:
   book_obj=Book.objects.create(title="金瓶眉",publishDate="2012-12-12",price=100,publish_id=1)  

核心:book_obj.publish与book_obj.publish_id是什么? 

多对多

复制代码
    # 当前生成的书籍对象
    book_obj=Book.objects.create(title="追风筝的人",price=200,publishDate="2012-11-12",publish_id=1)
    # 为书籍绑定的做作者对象
    yuan=Author.objects.filter(name="yuan").first() # 在Author表中主键为2的纪录
    egon=Author.objects.filter(name="alex").first() # 在Author表中主键为1的纪录

    # 绑定多对多关系,即向关系表book_authors中添加纪录
    book_obj.authors.add(yuan,egon)    #  将某些特定的 model 对象添加到被关联对象集合中。   =======    book_obj.authors.add(*[])
复制代码

数据库表纪录生成如下:

book表 

book_authors表

核心:book_obj.authors.all()是什么?

多对多关系其它常用API:

book_obj.authors.remove()      # 将某个特定的对象从被关联对象集合中去除。    ======   book_obj.authors.remove(*[])
book_obj.authors.clear()       #清空被关联对象集合
book_obj.authors.set()         #先清空再设置  

基于对象的跨表查询

一对多查询(Publish 与 Book)

正向查询(按字段:publish):

1
2
3
4
# 查询主键为1的书籍的出版社所在的城市
book_obj = Book.objects. filter (pk = 1 ).first()
# book_obj.publish 是主键为1的书籍对象关联的出版社对象
print (book_obj.publish.city)  

反向查询(按表名:book_set):

1
2
3
4
5
publish = Publish.objects.get(name = "苹果出版社" )
#publish.book_set.all() : 与苹果出版社关联的所有书籍对象集合
book_list = publish.book_set. all ()    
for  book_obj  in  book_list:
        print (book_obj.title)

一对一查询(Author 与 AuthorDetail)

正向查询(按字段:authorDetail):

1
2
egon = Author.objects. filter (name = "egon" ).first()
print (egon.authorDetail.telephone)

反向查询(按表名:author):

1
2
3
4
5
# 查询所有住址在北京的作者的姓名
 
authorDetail_list = AuthorDetail.objects. filter (addr = "beijing" )
for  obj  in  authorDetail_list:
      print (obj.author.name)

多对多查询 (Author 与 Book)

正向查询(按字段:authors):

1
2
3
4
5
6
# 金瓶眉所有作者的名字以及手机号
 
book_obj = Book.objects. filter (title = "金瓶眉" ).first()
authors = book_obj.authors. all ()
for  author_obj  in  authors:
      print (author_obj.name,author_obj.authorDetail.telephone)

反向查询(按表名:book_set):

1
2
3
4
5
6
# 查询egon出过的所有书籍的名字
 
     author_obj = Author.objects.get(name = "egon" )
     book_list = author_obj.book_set. all ()         #与egon作者相关的所有书籍
     for  book_obj  in  book_list:
         print (book_obj.title)

注意:

你可以通过在 ForeignKey() 和ManyToManyField的定义中设置 related_name 的值来覆写 FOO_set 的名称。例如,如果 Article model 中做一下更改:

1
publish  =  ForeignKey(Book, related_name = 'bookList' )

那么接下来就会如我们看到这般:

1
2
3
4
# 查询 人民出版社出版过的所有书籍
 
publish = Publish.objects.get(name = "人民出版社" )
book_list = publish.bookList. all ()   # 与人民出版社关联的所有书籍对象集合

猜你喜欢

转载自www.cnblogs.com/xz2ll/p/9252760.html