django中orm之什么是正向查询什么是反向查询

Publish

class Publish(models.Model):

  nid = models.AutoField(primary_key=True)

  name=models.CharField( max_length=32)

  city=models.CharField( max_length=32)

  email=models.EmailField()

 

表 Book

class Book(models.Model):

  nid = models.AutoField(primary_key=True)

  title = models.CharField( max_length=32)

  publishDate=models.DateField()

  price=models.DecimalField(max_digits=5,decimal_places=2)

  # 与Publish建立一对多的关系,外键字段建立在多的一方,字段publish如果是外键字段,那么它自动是int类型
       publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE) #foreignkey里面可以加很多的参数,都是需要咱们学习的,

  慢慢来,to指向表,to_field指向你关联的字段,不写这个,默认会自动关联主键字段,on_delete级联删除
  字段名称不需要写成publish_id,orm在翻译foreignkey的时候会自动给你这个字段拼上一个_id,这个字段名称

  在数据库里面就自动变成了publish_id # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表,并且注意一    点,你查看book表的时候,你看不到这个字段,因为这个字段就是创建第三张表的意思,不是创建字段          的意思,所以只能说这个book类里面有authors这个字段属性
      authors=models.ManyToManyField(to='Author',) #注意不管是一对多还是多对多,写to这个参数的时候,最后后面的值是个字符串,不然你就需要将你要关联的那个表放到这个表的上面

 

 

class Book(models.Model):

   title = models.CharField(max_length=32, verbose_name="书名") # 自己创建第三张表,并通过ManyToManyField指定关联
class Author(models.Model):

   name = models.CharField(max_length=32, verbose_name="作者姓名")

   books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book")) # through_fields接受一个2元组('field1','field2'):
    # 其中field1是定义ManyToManyField的模型外键的名(author),field2是关联目标模型(book)的外键名。


class Author2Book(models.Model):

   author = models.ForeignKey(to="Author")

   book = models.ForeignKey(to="Book") #可以扩展其他的字段了

   class Meta:

   unique_together = ("author", "book")

跨表查询是分组查询的基础,F和Q查询是最简单的,所以认真学习跨表查询

  一对多查询(Publish 与 Book)

    

    正向查询(按字段:publish):关联属性字段所在的表查询被关联表的记录就是正向查询,反之就是反向查询

# 查询主键为1的书籍的出版社所在的城市
book_obj=Book.objects.filter(pk=1).first()
# book_obj.publish 是主键为1的书籍对象关联的出版社对象,book对象.外键字段名称
print(book_obj.publish.city)  

    反向查询(按表名:book_set,因为加上_set是因为反向查询的时候,你查询出来的可能是多条记录的集合):

publish=Publish.objects.get(name="苹果出版社")
#publish.book_set.all() : 与苹果出版社关联的所有书籍对象集合,写法:小写的表名_set.all(),得到queryset类型数据
book_list=publish.book_set.all()    
for book_obj in book_list:
       print(book_obj.title)
posted @ 2020-05-22 12:12  星空之主  阅读(622)  评论(0编辑  收藏  举报