使用DRF进行的不同读写操作

问题描述 投票:0回答:1

我正在为项目使用Django Rest Framework,但遇到了问题。当前端创建团队时,他们想要引用具有ID的所有关系,但是在获得团队时,他们想要关系中的数据。我该如何实现?

型号:

class Team(models.Model):
    class Meta:
        db_table = "team"
    team_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)
    organization = models.ForeignKey(Organization, on_delete=models.CASCADE)

class Organization(models.Model):
    class Meta:
        db_table = "organization"
    organization_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)

class Position(models.Model):
    class Meta:
        db_table = "position"
    position_id = models.AutoField(primary_key=True)
    team = models.ForeignKey(Team, on_delete=models.CASCADE, related_name="positions")

class Player(model.Model):
    class Meta:
        db_table = "player"
    player_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)
    positions = models.ManyToManyField(Position, related_name="players")

序列化器:

class TeamSerializer(serializers.ModelSerializer):
    class Meta:
        model = Team
        fields = ["team_id", "name", "organization", "positions"]

    positions = PositionSerializer(many=True)  # This is merely for output. There is no need to create a position when a team is created.
    organization = OrganizationSerializer() # Since an organization already exists I'd like to just give an organization_id when creating/editing a team.

# I don't think the other serializers matter here but can add them on request.

所以当在团队中进行POST或PATCH时,我希望前端能够传递此有效负载

{
  "name": "My Team",
  "organization": 1
}

但是在团队中进行GET时,我希望前端收到此响应。

{
  "team_id": 1,
  "name": "My Team",
  "organization": {
    "organization_id": 1,
    "name": "My Organization"
  },
  "positions": [{
    "position_id": 1,
    "players": [{
      "player_id": 1,
      "name": "Member 1"
    }
  ]
}

有没有办法做到这一点?

django rest django-rest-framework serializer
1个回答
1
投票

在这种情况下,请定义两个串行器,一个用于读操作,一个用于写操作。

class TeamWriteSerializer(serializers.ModelSerializer):
    # see, here no nested relationships...
    class Meta:
        model = Team
        fields = ["name", "organization"]


class TeamReadSerializer(serializers.ModelSerializer):
    class Meta:
        model = Team
        fields = ["team_id", "name", "organization", "positions"]

    positions = PositionSerializer(many=True)
    organization = OrganizationSerializer()

现在,在您的视图中正确使用这两个序列化器。例如,我希望您在视图中使用ModelViewSet

class TeamModelViewSet(viewsets.ModelViewSet):
    def get_serializer_class(self):
        if self.request.method.lower() == 'get':
            return TeamReadSerializer
        else:
            return TeamWriteSerializer
© www.soinside.com 2019 - 2024. All rights reserved.