【问题标题】:How to get all objects referenced as ForeignKey from given field in a module in django如何从django模块中的给定字段中获取所有引用为ForeignKey的对象
【发布时间】: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”未定义的错误。

标签: python django


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你做了一些奇怪的事情

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

    删除它。您将能够使用author.book_set。也可以使用ForeignKeyrelated_name参数。

    详情请看这里:https://docs.djangoproject.com/en/1.9/ref/models/fields/#foreignkey

    【讨论】:

    • 谢谢,虽然我使用该方法时仍然收到此错误消息:NameError: name 'author' is not defined。作为澄清,我仍在尝试在模型中执行此操作,而不是在视图中执行此操作,我猜我也可以在视图中执行此操作。
    • 在模型中只需删除该行。在视图中,您可以使用author.book_set 访问作者的书籍。不要忘记定义author
    • 是的,所以我一直的错误是尝试在作者表中添加“书籍”字段。我想那时没有办法做到这一点。我可以让该方法在视图中工作,所以很好。
    • 像 Anush 的回答一样使用它。顺便说一句,不要用CamelCase 而是用with_underscores 调用模型属性。
    • 所以在作者模型中实现书籍字段是不可能的,而是应该稍后在视图中查询书籍?
    【解决方案3】:

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

    例如:

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

    以后……

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

    【讨论】:

    • 应该是all()
    猜你喜欢
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2019-11-22
    • 2015-10-08
    • 1970-01-01
    • 2015-10-23
    相关资源
    最近更新 更多