python - 如何创建一个对象,并从 POST 中的 id 链接到嵌套对象

标签 python django django-models django-views django-rest-framework

我正在尝试了解如何处理 django-rest-framework (DRF) 中的嵌套模型。我已阅读this part of the documentation ,它涉及编写一个可以保存嵌套对象的序列化器,但这并不完全是我想要的。在一篇文章中,我有相关(多对多)对象的 ID。

示例:
假设我有一场比赛(比如足球、网球),一场比赛是在 2 支球队之间进行的,并且球队由球员组成。我想发送带有比赛信息和玩家 ID 的 POST。如果玩家之前玩过,则已经组队,否则我们应该组队。

如果玩家 1 与玩家 2 进行了游戏 4,则 POST 将类似于

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()

所以我需要找出答案

  • 如何从帖子中获取 ID
  • 如何获取正确的团队 ID(并可能先创建它们)
  • 如何在序列化器上传递它们。

具体来说,这些功能中的哪些可以通过使用 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')

最佳答案

我认为你应该制作一个特殊的序列化器: 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

这能满足您的需求吗?最好的方法是在序列化器中解决此类问题,这就是它们的作用,将请求字段转换为正确的对象/字段。

也就是说,如果您想做一些简单的事情,您总是可以在 ModelViewSet 中访问 self.request

关于python - 如何创建一个对象,并从 POST 中的 id 链接到嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41684492/

相关文章:

django - 什么 AWS 服务可以帮助加快缓慢的 Django View 功能

django - 如何在模型的保存方法中访问 ManyToManyField?

django - 跨 2 个 FK 到同一个表的相关对象的总和,有条件

python - 在 Django 中获取 ManytoMany 的错误?

python - 我如何从 django 中的 mysql 检索数据并以模式显示,其中我也可以更新它?

python - 将 10,000 个 JSON 文件(总共 30GB)插入 MongoDB 的最佳方式

python - 文件对象 __exit__() 方法的文档

python - python中的子串

python - django python 日期时间设置为午夜

django - Heroku:djangosyncdb 似乎没有做任何事情。