如何从模型中嵌入Django中的相关数据?

时间:2017-12-10 07:25:31

标签: python django laravel django-models eager-loading

我几天以来一直在研究Django。我知道如何在Laravel中获得我想要的东西,但我需要Django的帮助。

假设我有两张桌子。 作者和书籍

书表包含:

id, name, author

authors表包含:

id, name

使用Laravel,我可以添加一个函数,它可以提供书籍和作者之间的关系,Book::with('authors')将为我提供书籍的所有数据以及额外的字段author,其中包含作者的详细信息。书。我不知道如何用Django做这个Eager Loading。

假设我使用 Book.objects.all()

然后我想要一个阵列中的所有书籍。在书的每一项中,都应该有一个可用的对象,它将提供有关该作者的详细信息。 例如:

{
[
{
 id: 3
 name: "Name of book",
 author: {
  id: 7,
  name: "Author name"
 }
},
{
 id: 4
 name: "Name of other book",
 author: {
  id: 3,
  name: "Author of other book"
 }
}
]
}

1 个答案:

答案 0 :(得分:0)

class Base(models.Model):
    name = models.Charfield(max_length=100)

    def to_dict(self):
        rtn = {}
        c = self._meta._get_fields(reverse=False)
        for i in c:
            item = str(i).split('.')[2]
            if hasattr(self, item):
                rtn[item] = getattr(self, item)
        return rtn

class Books(Base):
    author = models.ForeignKey(Author, related_name='authors')

    @classmethod
    def get_all_books(cls):
        l = []
        books = cls.objects.all()
        for book in books:
            book_dict = book.to_dict()
            book_dict['author'] = book.author.to_dict()
            l.append(book_dict)

        return {'result': l}

class Author(Base):

    def __str__(self):
        return self.name

我用这种方式编辑了你所要做的就是打电话

Book.get_all_books()

结果就像这样

{
'result': [
  {
    id: 3
    name: "Name of book",
    author: {
      id: 7,
      name: "Author name"
    }
  },
  {
    id: 4
    name: "Name of other book",
    author: {
      id: 3,
      name: "Author of other book"
    }
  }
]

}