【发布时间】:2016-03-15 00:50:42
【问题描述】:
我有两个类:Author 和 Book。我希望类 Authors 有一个属性,其中包含所述作者撰写的所有书籍,在类 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')
我得到的错误信息是:
NameError: name 'Book' is not defined
我得到的,是因为我引用了另一个类,而实际上没有该类的实例。我只是想不出一个正确的方法来做到这一点。
编辑:我将其重新格式化为:
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')
产生错误:
NameError: name 'author' is not defined
也许我应该稍后在视图中查询我需要的数据点,而不是在模型中为它们创建自己的字段..
编辑2:答案的解决方案:
所以我一直的错误是尝试在作者表中添加“书籍”字段。我想那时没有办法做到这一点。我可以让该方法在视图中工作,所以我想这已经解决了,尽管不是我最初计划的方式。
在做
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')
然后在视图中执行此操作:
author = Author.objects.get(pk=1)
books = author.book_get.all()
产生想要的结果(我事先知道,但我试图在模型中实现一个 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, related_name = "books")
【问题讨论】:
-
你读过documentation吗? Django 自动为你提供了这个方法。
-
我不确定如何在模型中使用它。如果这是传统的 python,我相信我可以使用
author = self.objects.get(pk=self.pk)查询它们,然后使用books = author.book_set.all()添加相关对象,但在 django 中,这会产生“self”未定义的错误。