django中orm反向查询 _set

本文介绍了Django ORM中的反向查询概念,重点讲解如何通过`_set`进行一查找多的操作。例如,一个出版社可以有多本书籍,通过出版社对象的`book_set`可以获取到该出版社下的所有书籍对象,这些书籍对象以QuerySet形式返回。文章通过实例演示了两种不同的方法来实现这一查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反向查询:一查找多,是反向查找
无外键类的具体对象.有外键的小写类名_set
无外键类是一,有外键是多.
一的具体对象.多的类名小写_set 查到一的具体对象下的所有多的对象
eg:
一个出版社对应多本书,以出版社为标准查找书,反向查找。
一个出版社对象.书类_set 查到出版社下的书籍对象,这个书籍对象默认是一个QuerySet对象
查到一个出版社具体对象下的所有的书
]
实例演示

#出版社类(表)
class Publisher(models.Model):
	pid = models.AutoField(primary_key=True)
	pname = models.CharField(max_length=32)


#书籍类(表)
class Books(models.Model):
	bid = models.AutoField(primary_key=True)
	bname = models.CharField(max_length=32)
	publisher_obj = models.ForeignKey('Publisher')

#展示出版社方法一:
views内:

def show_publisher(request):
	# 获取出版社对象列表
	publisher_obj_list = models.Publisher.objects.all()
	# 获取书籍,通过书籍中的外键对象publisher_obj
	# 循环这个出版社对象列表,在书籍表中匹配每一个出版社对象,匹配到就返回书籍对象列表,没有就是空的对象列表,该书籍对象,有具体的出版社对象
	books_obj_list = []
	for publishers_obj in publisher_obj_list:
		#获取到books_obj可能是一个列表
		books_obj = models.Books.objects.filter(publisher_obj=publishers_obj)
		#将books_obj列表里面的每一个内容拿出来,加到列表内
		books_obj_list.extend(books_obj)
	return render(request, 'show_publisher.html',
				  {"publisher_obj_list": publisher_obj_list, "books_obj_list": books_obj_list})

html模板中

<table border="1">
<thead>
<tr>
    <th>序号</th>
    <th>出版社名字</th>
    <th>书籍</th>
</tr>
</thead>
<tbody>
{% for publisher_obj in publisher_obj_list %}
    <tr>
   	    #序号
        <td>{{ forloop.counter }}</td>
        {# 出版社名字 #}
        <td>{{ publisher_obj.pname }}</td>
        {# 书籍名字#}
         <td>
         循环书籍对象列表(每一个书籍都有一个对应的publisher_obj)
                {% for books_obj in  books_obj_list %}
         判断如果这个出版社对象与书籍的出版社对象相同,获取该书籍的名字
                    {% if publisher_obj == books_obj.publisher_obj %}
                        《{{ books_obj.bname }}》
                    {% endif %}
                {% endfor %}
            {% endfor %}
            </td>

‘’’’
方法二:
views 中

def show_publisher(request):
# 获取出版社对象列表
publisher_obj_list = models.Publisher.objects.all()
return render(request, 'show_publisher.html',
			  {"publisher_obj_list": publisher_obj_list,})    

html文件中

#反向查找:通过一查找多
#无外键的具体对象(一的具体对象).有外键的小写类名(多的类名小写)_set.all()
#反向查找默认返回的是一个QuerySet对象#}

        <td>
            {% for book_obj in publisher_obj.books_set.all %}
                    《{{ book_obj.bname }}》
            {% endfor %}

        </td>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值