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
相关产品推荐
相关产品推荐

