[django] orm正向反向查询

21 篇文章 0 订阅

正向和反向查询
正向 ----> 关联字段在当前表中,从当前表向外查叫正向
反向 —> 关联字段不在当前表中,当当前表向外查叫反向
正向通过字段,反向通过表名查

一对一 OneToOneField

# 一个文章详情表一对一关联文章表,相当于Foreignkey 加unique
class Article(models.Model):
	nid = models.AutoField(primary_key=True)
	desc = models.CharField(max_length=255)
	
class ArticleDetail(models.Model):
    """
    文章详情表
    """
    nid = models.AutoField(primary_key=True)
    content = models.TextField()
    article = models.OneToOneField(to="Article", to_field="nid",on_delete=models.DO_NOTHING)

正向:

1、基于对象:obj.(外键).属性

ArticleDetail_obj = models.ArticleDetail.objects.filter(pk=pk).first()
ArticleDetail_obj.article.desc

2、基于字段跨表查询:外键__属性

models.ArticleDetail.objects.filter(pk=2).values("article__desc")

反向:从详情查文章

1、基于对象:obj.(表名小写).属性

article_obj = models.Article.objects.filter(pk=pk).first()
article_obj.articledetail.content

2、基于字段跨表查询:表名小写__属性

models.Article.objects.filter(id=1).values('articledetail__content')

一对多 ForeignKey

book – > publish :一个出版社有多个书

class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name=models.CharField( max_length=32)

class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField( max_length=32)
    # 与Publish建立一对多的关系
	publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE)

正向:

1、基于字段:obj.(外键).属性

book_obj = models.Book.objects.filter(title='红楼梦').first()
book_obj.publish.name

反向:obj.(表名小写_set).all()
1、set查询

publish_obj=models.Publish.objects.filter(name="教育").first()
books = publish_obj.book_set.all()
for book in books:
	print(book.title)

多对多 ManyToManyField


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)

class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name=models.CharField( max_length=32)
    age=models.IntegerField()
    
class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32)

    # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表
    authors=models.ManyToManyField(to='Author',)

正向:

1、基于字段:obj.(外键).all()

book_obj = models.Book.objects.filter(title="python教程").first()
authors = book_obj.authors.all()
for author in authors:
	print(author.name,author.age)

反向:obj.(表名小写_set).all()
1、set查询

author_obj = models.Author.objects.filter(name="moke").first()
books = author_obj.book_set.all()
for book in books:
	print(book.title)

2、related_name查询

author_obj.related_name.all()
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Moke丶青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值