Как отфильтровать записи, которые не имеют записей в связанной таблице?

Рассмотрим две следующие модели:

from django.db import models


class Author(models.Model):    
    name = models.CharField(max_length=255)

    
class Book(models.Model):
    author = models.ForeignKey(Author, models.CASCADE, related_name="books")

как получить только авторов, у которых нет книг?

Вы можете сделать что-то вроде этого: получить всех авторов книг, а затем получить всех авторов, которых вы не получили в первом запросе (то есть у них нет книг).

Непроверенный код:


# fetch all the author ids that have books
authors_with_books = Book.objects.distinct('author').values_list('author_id', flat=True)

# fetch all the authors that have no books
authors_with_no_books = Author.objects.exclude(id__in=authors_with_books)

Для выполнения этого фильтра можно использовать isnull или просто передать None в related_name

Author.objects.filter(books__isnull=True)
Author.objects.filter(books=None)
Вернуться на верх