【问题标题】:Different write and read operations with DRF使用 DRF 进行不同的写入和读取操作
【发布时间】:2020-04-03 00:08:49
【问题描述】:

我正在为一个项目使用 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 serialization


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2014-02-26
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2017-03-05
      相关资源
      最近更新 更多