Django 中的 ManyToManyField 序列化
ManyToManyField serialization in Django
我在 https://docs.djangoproject.com/en/2.1/topics/db/examples/many_to_many/ 浏览了以下文档并尝试使用它来学习 DRF 的序列化。
所以,我的models.py是:
class Publication(models.Model):
title = models.CharField(max_length=30)
class Meta:
ordering = ('title',)
class Article(models.Model):
headline = models.CharField(max_length=100)
publications = models.ManyToManyField(Publication)
class Meta:
ordering = ('headline',)
我的serializers.py看起来像:
class PublicationSerializer(serializers.ModelSerializer):
class Meta:
model = Publication
fields = ('title',)
class ArticleSerializer(serializers.ModelSerializer):
publications = PublicationSerializer(read_only=True, many=True)
class Meta:
model = Article
fields = ('headline', 'publications')
我通过 shell 创建了一些对象:
>>> from publications.models import Article, Publication
>>> from publications.serializers import ArticleSerializer, PublicationSerializer
>>> p1 = Publication(title='The Python Journal')
>>> p1.save()
>>> p2 = Publication(title='Science News')
>>> p2.save()
>>> p3 = Publication(title='Science Weekly')
>>> p3.save()
>>> a1 = Article(headline='Django lets you build Web apps easily')
>>> a1.save()
>>> a1.publications.add(p1,p2,p3)
>>> serializer = ArticleSerializer(instance=a1)
>>> serializer.data
{'headline': 'Django lets you build Web apps easily', 'publications': [OrderedDict([('title', 'Science News')]), OrderedDict([('title', 'Science Weekly')]), OrderedDict([('title', 'The Python Journal')])]}
因此,当我 运行 服务器时一切正常。当我导航到 /articles:
时,这是 JSON 表示
[
{
"headline": "Django lets you build Web apps easily",
"publications": [
{
"title": "Science News"
},
{
"title": "Science Weekly"
},
{
"title": "The Python Journal"
}
]
}
]
但是在我的 urls.py 中,我还有一个 /publications link 显示了列表出版物:
[
{
"title": "Science News"
},
{
"title": "Science Weekly"
},
{
"title": "The Python Journal"
}
]
因此,上面显示的第一个 JSON 表示 (/articles) 向我展示了文章,并为我提供了与该文章相关的出版物列表。正如我之前所说,这看起来符合预期。
但是在显示出版物列表的第二个 JSON 表示 (/publications) 中,我看不到与每个出版物相关的文章列表。
我怎样才能做到这一点 ?我应该添加另一个 ManyToManyField 到 Publication class 吗?还是 ForeignKey 字段就足够了?
当我导航到 /publications:
时,我想要的是如下所示的 JSON 表示
[
{
"title": "Science News"
"article":[ <-- This info should be added
"..." , etc.
]
},
{
"title": "Science Weekly"
"article":[
"..." , etc.
]
},
{
"title": "The Python Journal"
"article":[
"..." , etc.
]
}
]
我希望有人能提供帮助。提前致谢:)
您不需要添加任何模型字段。您只需将 "article_set" 添加到 PublicationSerializer 中的 fields
列表。
我在 https://docs.djangoproject.com/en/2.1/topics/db/examples/many_to_many/ 浏览了以下文档并尝试使用它来学习 DRF 的序列化。
所以,我的models.py是:
class Publication(models.Model):
title = models.CharField(max_length=30)
class Meta:
ordering = ('title',)
class Article(models.Model):
headline = models.CharField(max_length=100)
publications = models.ManyToManyField(Publication)
class Meta:
ordering = ('headline',)
我的serializers.py看起来像:
class PublicationSerializer(serializers.ModelSerializer):
class Meta:
model = Publication
fields = ('title',)
class ArticleSerializer(serializers.ModelSerializer):
publications = PublicationSerializer(read_only=True, many=True)
class Meta:
model = Article
fields = ('headline', 'publications')
我通过 shell 创建了一些对象:
>>> from publications.models import Article, Publication
>>> from publications.serializers import ArticleSerializer, PublicationSerializer
>>> p1 = Publication(title='The Python Journal')
>>> p1.save()
>>> p2 = Publication(title='Science News')
>>> p2.save()
>>> p3 = Publication(title='Science Weekly')
>>> p3.save()
>>> a1 = Article(headline='Django lets you build Web apps easily')
>>> a1.save()
>>> a1.publications.add(p1,p2,p3)
>>> serializer = ArticleSerializer(instance=a1)
>>> serializer.data
{'headline': 'Django lets you build Web apps easily', 'publications': [OrderedDict([('title', 'Science News')]), OrderedDict([('title', 'Science Weekly')]), OrderedDict([('title', 'The Python Journal')])]}
因此,当我 运行 服务器时一切正常。当我导航到 /articles:
时,这是 JSON 表示[
{
"headline": "Django lets you build Web apps easily",
"publications": [
{
"title": "Science News"
},
{
"title": "Science Weekly"
},
{
"title": "The Python Journal"
}
]
}
]
但是在我的 urls.py 中,我还有一个 /publications link 显示了列表出版物:
[
{
"title": "Science News"
},
{
"title": "Science Weekly"
},
{
"title": "The Python Journal"
}
]
因此,上面显示的第一个 JSON 表示 (/articles) 向我展示了文章,并为我提供了与该文章相关的出版物列表。正如我之前所说,这看起来符合预期。 但是在显示出版物列表的第二个 JSON 表示 (/publications) 中,我看不到与每个出版物相关的文章列表。 我怎样才能做到这一点 ?我应该添加另一个 ManyToManyField 到 Publication class 吗?还是 ForeignKey 字段就足够了? 当我导航到 /publications:
时,我想要的是如下所示的 JSON 表示 [
{
"title": "Science News"
"article":[ <-- This info should be added
"..." , etc.
]
},
{
"title": "Science Weekly"
"article":[
"..." , etc.
]
},
{
"title": "The Python Journal"
"article":[
"..." , etc.
]
}
]
我希望有人能提供帮助。提前致谢:)
您不需要添加任何模型字段。您只需将 "article_set" 添加到 PublicationSerializer 中的 fields
列表。