如何从django中的模块中的给定字段获取所有引用为ForeignKey的对象

Chr*_* W. 6 python django

我有两个类:作者和书.我希望类作者有一个属性,其中包含所述作者编写的所有书籍,在Books类中引用为外键.我所做的方法似乎没有用,我假设是因为在迁移中创建数据库时,还没有Books对象存在.或者我相信,我对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')
Run Code Online (Sandbox Code Playgroud)

我得到的错误信息是:

NameError: name 'Book' is not defined
Run Code Online (Sandbox Code Playgroud)

我得到的,是因为我引用了另一个类而没有实际拥有该类的实例.我只是无法找到一个正确的方法来做到这一点.

编辑:我重新格式化它是这样的:

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')
Run Code Online (Sandbox Code Playgroud)

产生错误:

NameError: name 'author' is not defined
Run Code Online (Sandbox Code Playgroud)

也许我应该在视图中查询稍后需要的数据点,而不是在模型中为它​​们创建自己的字段.

编辑2:答案的解决方案:

所以我的错误一直是尝试在作者表中添加"books"字段.我想那时候没办法做到这一点.我可以让这个方法在视图中工作,所以我想这有点解决了,虽然不是我最初打算这样做的方式.

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')
Run Code Online (Sandbox Code Playgroud)

然后在视图中执行此操作:

author = Author.objects.get(pk=1)
books = author.book_get.all()
Run Code Online (Sandbox Code Playgroud)

产生想要的结果(我之前已经知道了,但我试图在模型中实现一个书籍领域,如果我正确理解的话,至少不能用这种方法).

另一种方案:

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")
Run Code Online (Sandbox Code Playgroud)

Anu*_*dra 12

您无需在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')
Run Code Online (Sandbox Code Playgroud)

您可以获得特定作者的所有书籍:

author = Author.objects.get(id=1)
books = author.book_set.all()
Run Code Online (Sandbox Code Playgroud)

了解更多关于落后的关系,在这里


r_j*_*r_j 6

只需将其添加related_name到ForeignKey中,您就可以获取作者编写的所有书籍。

例如:

class Book(models.Model):
    ...
    author = models.ForeignKey('Author', related_name='books')
    ...
Run Code Online (Sandbox Code Playgroud)

然后...

author = Author.objects.get(pk=1)
books = author.books.all()
Run Code Online (Sandbox Code Playgroud)

  • 应该是all() (2认同)