如何在django

时间:2015-12-09 16:33:50

标签: 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')

我得到的错误信息是:

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:答案的解决方案:

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

操作

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()

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

另一种解决方案:

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")

3 个答案:

答案 0 :(得分:8)

您无需在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')

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

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

详细了解落后关系here

答案 1 :(得分:5)

只需将related_name添加到ForeignKey,您就可以获得作者制作的所有图书。

例如:

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

以后......

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

答案 2 :(得分:2)

你做了一些奇怪的事情

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

删除它。您将可以使用author.book_set。您还可以使用related_name的{​​{1}}参数。

在此查看详细信息:https://docs.djangoproject.com/en/1.9/ref/models/fields/#foreignkey