You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django无外键双表查询:按作者名获取作者及关联书籍

解决无外键关联下按作者名过滤并获取关联书籍的问题

嘿,我懂你的处境——两个模型没设外键关联,但又要实现按作者名找对应书籍的需求对吧?不用原生SQL完全能搞定,咱们一步步来调整代码:

首先你已经通过作者名过滤出了符合条件的authors对象,接下来核心思路是:先提取这些作者的authorid,再用这个ID列表去筛选Books表中对应的书籍。这里要注意一个关键细节:你的Books模型里authorid是CharField类型,而Authors里的authorid是IntegerField,所以得把ID转成字符串才能保证匹配准确,避免类型不兼容的问题。

修改后的完整get方法代码如下:

from django.http import JsonResponse

class Author_Books(generics.GenericAPIView):
    def get(self, request, *args, **kwargs):
        try:
            authorname = 'Author Name'
            # 过滤出包含目标作者名的作者对象
            authors = Authors.objects.filter(authorname__icontains=authorname)
            
            # 提取作者ID并转成字符串列表(适配Books表的字段类型)
            # 用values_list会比遍历对象更高效
            author_ids = [str(author_id) for author_id in authors.values_list('authorid', flat=True)]
            
            # 根据ID列表筛选关联的书籍
            related_books = Books.objects.filter(authorid__in=author_ids)
            
            # 构造包含作者信息和对应书籍的响应数据
            response_data = []
            for author in authors:
                # 筛选当前作者对应的书籍
                author_books = related_books.filter(authorid=str(author.authorid))
                response_data.append({
                    "author_id": author.authorid,
                    "author_name": author.authorname,
                    "books": list(author_books.values("bookid", "bookname"))
                })
            
            # 返回JSON格式响应比纯文本更友好
            return JsonResponse(response_data, safe=False)
        except Exception as err:
            return HttpResponse(f"查询出错: {str(err)}", status=500)

额外小建议:

如果后续有机会调整模型结构,非常建议给两个模型加上外键关联,这会让查询逻辑更简洁,也更符合Django ORM的设计规范。比如把Books里的authorid字段修改为:

authorid = models.ForeignKey(Authors, on_delete=models.DO_NOTHING, db_column='authorid')

(因为你的模型设置了managed=False,所以不用担心Django会自动修改数据库结构)

加上外键后,查询作者的关联书籍就可以直接用author.books_set.all(),代码会优雅很多~

内容的提问来源于stack exchange,提问作者Newcomer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:44:50