Django:通过参数序列化具有多对多关系的模型

Posted

技术标签:

【中文标题】Django:通过参数序列化具有多对多关系的模型【英文标题】:Django: Serialize a model with a many-to-many relationship with a through argument 【发布时间】:2017-06-18 00:36:25 【问题描述】:

模型定义了一个文章和一个作者类。它们以多对多的关系联系在一起。这种关系是通过自定义中间表定义的:

# models.py
class Article(models.Model):
    title = models.CharField(max_length=500)
    authors = models.ManyToManyField(Author, through='AuthorOrder')

class Author(models.Model):
    name = models.CharField(max_length=255)

class AuthorOrder(models.Model):
    author = models.ForeignKey(Author)
    article = models.ForeignKey(Article)
    writing_order = models.IntegerField()

序列化应该返回一个像这样的 JSON:

#articles_json
"fields":
     
         "title": "A title",
         "authors": [
             
                 "name":"Author 1",
                 "writing_order": 1
             ,
             
                 "name":"Author 2",
                 "writing_order": 2
             
         
     

我已经确定了两种解决方案。

This one 建议单独序列化 AuthorOrder 字段。 第二个是use the Django Rest Framework。

我尝试了这两个但没有成功。你知道另一种方法吗?

【问题讨论】:

“使用 DRF”是正确的做法,但这不是解决方案。您希望序列化数据采用什么格式? “但没有成功”将是您应该提供更多详细信息(您是如何做到的以及错误是什么)以使其成为真正的 SO 问题的地方。 DRF 见***.com/questions/19180242/… 【参考方案1】:

感谢您的反馈,我专注于 Django REST 框架并且它有效。以下是我编写的自定义序列化程序:

# serializers.py
from rest_framework import serializers
from app.models import Article, AuthorsOrder


class AuthorsOrderSerializer(serializer.ModelSerializer):
    author_name = serializers.ReadOnlyField(source='author.name')

    class Meta:
        model = AuthorsOrder
        fields = ('writing_order', 'author_name')


class ArticleSerializer(serializer.ModelSerializer):
    authors = AuthorsOrderSerializer(source='authorsorder_set', many=True)

    class Meta:
        model = Article
        fields = ('title', 'authors')

来源:

    Include intermediary (through model) in responses in Django Rest Framework https://bitbucket.org/snippets/adautoserpa/MeLa/django-rest-framework-manytomany-through

【讨论】:

但这并没有按照正确的顺序给出作者,是吗? 是的。感谢 AuthorsOrderSerializer 实例。 “authorsorder_set”从何而来?? 嗨@pzijd,在这里,作者姓名应该是:title: "some title, authors: ["name": "some name 1", "name": "some name 2"] 我们可以有类似的东西:["title": "some title", "author_name": "some name 1", "title": "some title", "author_name": "some name 2"]

以上是关于Django:通过参数序列化具有多对多关系的模型的主要内容,如果未能解决你的问题,请参考以下文章

Django内联表单集通过另一个模型在多对多关系中过滤

在 django 中获取具有多对多关系的复杂查询集

具有外键和多对多关系的 Django 模型与同一模型

图书管理的图书增删改查choices参数MTV与MVC模型多对多关系的三种创建方式Ajax操作前后端传输数据编码格式ajax发送json格式数据ajax发送文件django自带的序列化

图书管理的图书增删改查choices参数MTV与MVC模型多对多关系的三种创建方式Ajax操作前后端传输数据编码格式ajax发送json格式数据ajax发送文件django自带的序列化

具有多对多关系的Django表单不保存