【问题标题】:How to nest two many-to-many fields in Django ORM如何在 Django ORM 中嵌套两个多对多字段
【发布时间】:2021-07-22 00:51:18
【问题描述】:

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

+----+------------+-----------+
| ID | Author(FK) | Book (FK) |
+----+------------+-----------+
|  1 |         20 |        12 |
|  2 |         20 |        35 |
|  3 |         20 |        70 |
|  4 |         25 |        15 |
+----+------------+-----------+

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

{
  "1": {
    "Author": "20",
    "Book": "12"
  },
  "2": {
    "Author": "20",
    "Book": "35"
  },
  "3": {
    "Author": "20",
    "Book": "70"
  },
  "4": {
    "Author": "25",
    "Book": "15"
  },
}

想要的输出应该是这样的:

[
  {
    "author": 20,
    "books": [
      12,
      35,
      70
    ]
  },
  {
    "author": 25,
    "books": [
      15
    ]
  }
]

这是我的序列化器:

class AuthorBooksSerializer(serializers.ModelSerializer):

    class Meta:
        model = AuthorBooks
        fields = '__all__'

如何将一个作者的所有书籍合并到一个数组中?

【问题讨论】:

标签: django django-rest-framework django-orm


【解决方案1】:

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

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 属性来实现SQL 的Many to One relationship,而不是定义单独的模型AuthorBooks

from django.db import models
class Book(models.Model):
   # ...snip...
   author = models.ForeignKey(Book, related_name="books", on_delete=models.CASCADE)

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

Book.objects.get(1).author # related author instance
Author.objects.get(1).books # list of books

【讨论】:

    猜你喜欢
    • 2021-10-07
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多