首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Django ORM中嵌套两个多对多字段

如何在Django ORM中嵌套两个多对多字段
EN

Stack Overflow用户
提问于 2021-04-29 00:18:33
回答 1查看 42关注 0票数 0

我有一个表,它关联两个表,表Author和表Book。

代码语言:javascript
复制
+----+------------+-----------+
| ID | Author(FK) | Book (FK) |
+----+------------+-----------+
|  1 |         20 |        12 |
|  2 |         20 |        35 |
|  3 |         20 |        70 |
|  4 |         25 |        15 |
+----+------------+-----------+

我正在使用一个序列化程序,我的输出如下所示:

代码语言:javascript
复制
{
  "1": {
    "Author": "20",
    "Book": "12"
  },
  "2": {
    "Author": "20",
    "Book": "35"
  },
  "3": {
    "Author": "20",
    "Book": "70"
  },
  "4": {
    "Author": "25",
    "Book": "15"
  },
}

期望的输出将如下所示:

代码语言:javascript
复制
[
  {
    "author": 20,
    "books": [
      12,
      35,
      70
    ]
  },
  {
    "author": 25,
    "books": [
      15
    ]
  }
]

这是我的序列化程序:

代码语言:javascript
复制
class AuthorBooksSerializer(serializers.ModelSerializer):

    class Meta:
        model = AuthorBooks
        fields = '__all__'

我应该怎么做才能将作者的所有书籍合并到一个数组中?

EN

回答 1

Stack Overflow用户

发布于 2021-05-02 00:12:17

使用DRF's PrimaryKeyRelatedField,您可以像这样改进您的AuthorBooksSerializer

代码语言:javascript
复制
from .models import Book, Author, AuthorBooks

class AuthorBooksSerializer(serializers.ModelSerializer):
    author = serializers.PrimaryKeyRelatedField(read_only=True, queryset=Author.objects.all())
    books = serializers.PrimaryKeyRelatedField(many=True, read_only=True, queryset=Book.objects.all())
    
    class Meta:
        model = AuthorBooks
        fields = '__all__'

奖金

您可以只使用Book模型上的ForeignKey属性来实现AuthorBooksMany to One relationship,而不是定义一个单独的模型SQL,

代码语言:javascript
复制
from django.db import models
class Book(models.Model):
   # ...snip...
   author = models.ForeignKey(Book, related_name="books", on_delete=models.CASCADE)

然后,您可以进行如下查询:

代码语言:javascript
复制
Book.objects.get(1).author # related author instance
Author.objects.get(1).books # list of books
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67304053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档