Cómo obtener todos los objetos referenciados como ForeignKey desde un campo dado en un módulo en django

Tengo dos clases: Autor y Libro. Quiero que los autores de la clase tengan un atributo que contenga todos los libros escritos por dicho autor, como se menciona como clave externa en los libros de la clase. El método que hice no parece estar funcionando, lo que asumo es que cuando se crea la base de datos en las migraciones, todavía no existe ningún objeto de Libros. O eso creo, soy bastante nuevo en django.

class Author(models.Model): AuthorName = models.CharField(max_length=255, unique=True) books = Book.objects.get(pk=object_instance.pk) class Book(models.Model): BookName = models.CharField(max_length=255) Author = models.ForeignKey('Author') 

El mensaje de error que recibo es:

 NameError: name 'Book' is not defined 

Lo que recibo, es porque me estoy refiriendo a otra clase sin tener realmente una instancia de esa clase. Simplemente no puedo encontrar una manera adecuada de hacer esto.

EDIT: lo reformateé para ser así:

 class Author(models.Model): AuthorName = models.CharField(max_length=255, unique=True) books = author.book_set.all() class Book(models.Model): BookName = models.CharField(max_length=255) Author = models.ForeignKey('Author') 

que produce error:

 NameError: name 'author' is not defined 

Tal vez debería consultar los puntos de datos que necesito más adelante en las vistas en lugar de crear un campo propio para ellos en los modelos …

EDIT 2: solución de las respuestas:

Así que mi error fue intentar agregar el campo “libros” en la tabla de autores. Supongo que no hay manera de hacer esto entonces. Puedo conseguir que el método funcione en vistas, así que supongo que esto está resuelto, aunque no de la forma en que originalmente pensaba hacerlo.

obra

 class Author(models.Model): AuthorName = models.CharField(max_length=255, unique=True) class Book(models.Model): BookName = models.CharField(max_length=255) Author = models.ForeignKey('Author') 

y luego haciendo esto en vistas:

 author = Author.objects.get(pk=1) books = author.book_get.all() 

produce el resultado deseado (que sabía de antemano, pero estaba tratando de implementar un campo de libros en los modelos, que, si entendí correctamente, no es posible, al menos no con este método).

otra solución:

 class Author(models.Model): AuthorName = models.CharField(max_length=255, unique=True) class Book(models.Model): BookName = models.CharField(max_length=255) Author = models.ForeignKey(Author, related_name = "books") 

No es necesario crear un campo separado en el modelo de Authors

 class Author(models.Model): AuthorName = models.CharField(max_length=255, unique=True) class Book(models.Model): BookName = models.CharField(max_length=255) Author = models.ForeignKey('Author') 

Puede obtener todos los libros de un autor en particular como:

 author = Author.objects.get(id=1) books = author.book_set.all() 

Aprenda más sobre las relaciones atrasadas aquí

Simplemente agregue related_name a ForeignKey y podrá obtener todos los libros creados por un autor.

Por ejemplo:

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

y después…

 author = Author.objects.get(pk=1) books = author.books.all() 

Hiciste algo raro en la linea

 books = Book.objects.get(pk=object_instance.pk) 

Sólo elimínalo. Podrás utilizar author.book_set . También puede usar el parámetro related_name de ForeignKey .

Busque aquí para obtener más detalles: https://docs.djangoproject.com/en/1.9/ref/models/fields/#foreignkey