<p>您可以使用<strong>按位<code>|</code></strong>运算符作为</p>
<pre><code>from django.http.response import Http404
class BooksView(APIView):
def get(self, request, author, book=None):
author = get_object_or_404(Author, slug=author)
<b>book_qs</b> = author.author_books
if book:
<b>single_book_qs = Book.objects.filter(id=book)
if not single_book_qs.exists():
raise Http404
book_qs = single_book_qs | book_qs</b>
serializer = BooksSerializer(<b>book_qs</b>, many=True)
return Response(serializer.data)</code></pre>
<p>请注意,此解决方案的一个警告是,如果使用<strong><code>order_by(...)</code></strong>方法,位置将根据表达式的顺序进行更改</p>
<h2>更新1</h2>
<p>因为您使用的是<code>order_by(...)</code>表达式,所以必须执行以下操作:</p>
<pre><code>class BooksView(APIView):
def get(self, request, author, book=None):
author = get_object_or_404(Author, slug=author)
book_qs = author.author_books.order_by("-pub_date")
<b>serialized_single_book = []</b>
if book:
single_book = get_object_or_404(Book, id=book)
<b>book_qs.exclude(id=book) # to remove dups
serialized_single_book = [BooksSerializer(single_book).data]</b>
serializer = BooksSerializer(book_qs, many=True)
<b>serialized_book_qs = serializer.data</b>
return Response(<b>[*serialized_single_book, *serialized_book_qs]</b>)</code></pre>