我正努力研究如何处理django-rest框架(DRF)中的嵌套模型。我读过文档的这一部分,它处理编写可以保存嵌套对象的序列化程序,但这不是我想要的。在一篇文章中,我有相关对象的id(多到多)。
示例:
假设我有一场比赛(比如足球、网球),一场比赛是两支球队之间的比赛,球队由球员组成。我想发送一个带有匹配信息和玩家ids的POST
。如果球员在已经有一支球队之前就打过比赛,否则我们就应该加入球队。
如果玩家1和第2玩家打第4场比赛,那么门柱看起来就像
team_1[player_1_id]:1 // 1st player of team 1 is user 1
team_2[player_1_id]:2 // 1st player of team 2 is user 2
game:4
事实上,所有的事情都需要去做,我想也许view
是个好地方:在它准备好序列化之前,我需要对一些数据进行洗牌;但是我该如何开始呢?
我可以覆盖perform_create
来执行这样的魔术:
class MatchViewSet(viewsets.ModelViewSet):
queryset = Match.objects.all()
serializer_class = MatchSerializer
def perform_create(self, serializer):
// get the user ids form the post
// find if there is are teams, otherwise create the teams
// get team ids from above
// add team ids to data so serializer kan save
serializer.save()
所以我要找出
具体而言,可以通过使用DRF和/或ModelViewSet的就地函数来完成这些功能中的什么。我也想在这里学习这个框架:)
模特们都是这样的。我不想保存一个完整的嵌套对象,所以我不需要在这里添加一个特定的create
?
class Match(models.Model):
game = models.ForeignKey(Game)
teams = ManyToManyField(Team, through='MatchTeams')
其他可能相关的模式包括;
class MatchTeams(models.Model):
match = models.ForeignKey(Match)
team = models.ForeignKey(Team)
class Team(models.Model):
name = models.TextField(max_length=128)
users = ManyToManyField(User, through='TeamUsers')
发布于 2017-01-17 05:33:38
我认为您应该做一个特殊的序列化程序:http://www.django-rest-framework.org/api-guide/serializers/#saving-instances
就像这样:
class MatchSerializer(serializers.Serializer):
player_1 = serializers.IntegerField()
player_2 = serializers.IntegerField()
id = serializers.IntegerField()
def create(self, validated_data):
try:
team = Team.objects.filter(Q(users__id=player_1 & users__id=player_2))
except Team.DoesNotExcist:
team = Team.objects.create()
team.users.add(player_1)
team.users.add(player_2)
team.save()
match = super(serializers.Serializer, self)
match.teams.add(team)
# Something like this, but you have to post both team members at once. Can be made so you don't have to oc. You also might want to check the count of teams before adding them :-)
return match
def update(self, instance, validated_data):
# same as create but on a given match?
return instance
这能满足你的需要吗?最好的方法是在序列化器中解决这类问题,将请求字段转换为适当的对象/字段。
尽管如此,如果您想做一些简单的事情,则始终可以在self.request
中访问ModelViewSet
。
https://stackoverflow.com/questions/41684492
复制