我有一个关于在django rest框架中处理m2m/through模型及其表示的问题。举个典型的例子:
型号.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()
序列化程序.py:
imports...
class MemberSerializer(ModelSerializer):
class Meta:
model = Member
class GroupSerializer(ModelSerializer):
class Meta:
model = Group
视图.py:
imports...
class MemberViewSet(ModelViewSet):
queryset = Member.objects.all()
serializer_class = MemberSerializer
class GroupViewSet(ModelViewSet):
queryset = Group.objects.all()
serializer_class = GroupSerializer
在获取Member的实例时,我成功地接收了该成员的所有字段及其组,但是我只获取组的详细信息,而没有来自成员资格模型的额外详细信息。
换句话说,我希望收到:
{
'id' : 2,
'name' : 'some member',
'groups' : [
{
'id' : 55,
'name' : 'group 1'
'join_date' : 34151564
},
{
'id' : 56,
'name' : 'group 2'
'join_date' : 11200299
}
]
}
注意连接日期。
我已经尝试了太多的解决方案,当然包括Django Rest-Framework official page about it,但似乎没有人给出一个正确的明确答案-我需要做什么来包含这些额外的字段?我发现DjangoTastypie更直截了当,但是有一些其他问题,我更喜欢使用rest框架。
我遇到了这个问题,我的解决方案(使用DRF 3.6)是在对象上使用SerializerMethodField并显式查询成员表,如下所示:
这将返回groups键的dict列表,其中每个dict都是从membershipsserializer序列化的。要使其可写,可以在MemberSerializer中定义自己的create/update方法,在该方法中迭代输入数据并显式创建或更新成员资格模型实例。
注:作为一名软件工程师,我喜欢使用体系结构,并且我已经深入研究了分层开发方法,因此我将回答关于层的问题。
据我所知,这是解决办法 模型.py
序列化程序.py
自定义模型.py
业务逻辑.py
从技术上讲,您必须将请求传递给Data Access Layer,DataAccessLayer将从数据访问层返回经过筛选的对象,但是由于我必须快速回答问题,所以我调整了业务逻辑层中的代码!
不如。。。。。
在MemberSerializer上,定义一个字段,如下所示:
然后在您的成员资格序列化程序上,您可以创建:
它的总体效果是创建一个序列化的值groups,它的源具有您想要的成员身份,然后它使用自定义序列化程序提取您想要显示的位。
编辑:正如@bryanph所评论的,在DRF 3.0中,
serializers.field
被重命名为serializers.ReadOnlyField
,因此应该是:对于任何现代实现
相关问题 更多 >
编程相关推荐