我有一个关于如何处理m2m / through模型及其在django rest框架中的表现的问题,让我们举一个经典的例子:
models.py:
from django.db import models
class Member(models.Model):
name = models.CharField(max_length = 20)
groups = models.ManyToManyField('Group', through = 'Membership')
class Group(models.Model):
name = models.CharField(max_length = 20)
class Membership(models.Model):
member = models.ForeignKey('Member')
group = models.ForeignKey('Group')
join_date = models.DateTimeField()
serializers.py:
imports...
class MemberSerializer(ModelSerializer):
class Meta:
model = Member
class GroupSerializer(ModelSerializer):
class Meta:
model = Group
views.py:
imports...
class MemberViewSet(ModelViewSet):
queryset = Member.objects.all()
serializer_class = MemberSerializer
class GroupViewSet(ModelViewSet):
queryset = Group.objects.all()
serializer_class = GroupSerializer
当获取一个Member示例时,我成功地接收到了成员的所有字段以及它的组-但是我只得到了组的详细信息,没有来自Membership模型的额外详细信息。
换句话说,我希望收到:
{
'id' : 2,
'name' : 'some member',
'groups' : [
{
'id' : 55,
'name' : 'group 1'
'join_date' : 34151564
},
{
'id' : 56,
'name' : 'group 2'
'join_date' : 11200299
}
]
}
请注意加入日期。
我已经尝试了很多解决方案,当然包括Django的REST框架官方页面,但似乎没有人给予一个合适的简单答案-我需要做什么来包含这些额外的字段?我发现使用Django-tastypie更直接,但有一些其他问题,更喜欢REST框架。
4条答案
按热度按时间ih99xse11#
不如...
在MemberSerializer上,定义一个字段,如下所示:
然后在你的成员序列化器上你可以创建这个:
这样做的总体效果是创建一个序列化值groups,它将所需的成员资格作为其源,然后使用自定义序列化程序提取要显示的位。
编辑:如@bryanph所述,在DRF 3.0中,
serializers.field
被重命名为serializers.ReadOnlyField
,因此应为:对于任何现代实现
zpqajqem2#
我遇到了这个问题,我的解决方案(使用DRF 3.6)是在对象上使用SerializerMethodField,并显式查询Membership表,如下所示:
这将返回组键的字典列表,其中每个字典都是从MembershipSerializer序列化的。若要使其可写,您可以在MemberSerializer中定义自己的创建/更新方法,在其中迭代输入数据并显式创建或更新成员资格模型示例。
w8ntj3qf3#
我遇到了同样的问题,最后我用组查询集上的注解解决了这个问题。
dldeef674#
注意:作为一名软件工程师,我喜欢使用体系结构,并且我已经深入研究了分层开发方法,所以我将回答关于层的问题。
据我所知,问题的解决方案如下models.py
serializers.py
CustomModels.py
BusinessLogic.py
从技术上讲,您必须将请求传递到DataAccessLayer,DataAccessLayer将从数据访问层返回过滤的对象,但由于我必须以快速的方式回答问题,所以我调整了业务逻辑层中的代码!