Различные операции записи и чтения с DRF - PullRequest
0 голосов
/ 03 апреля 2020

Я использую Django Rest Framework для проекта и столкнулся с проблемой. Когда веб-интерфейс создает команду, он хочет ссылаться на все отношения с идентификатором, но при получении команды они хотят получить данные из отношений. Как мне этого добиться?

модели:

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"
    }
  ]
}

Есть ли способ достичь этого?

1 Ответ

1 голос
/ 03 апреля 2020

В таких ситуациях определите два сериализатора, один для операций чтения, а другой для операций записи.

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


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

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

и теперь правильно используйте эти два сериализатора в своих представлениях. Например, я надеюсь, что вы используете ModelViewSet в представлениях,

class TeamModelViewSet(viewsets.ModelViewSet):
    <b>def get_serializer_class(self):
        if self.request.method.lower() == 'get':
            return TeamReadSerializer
        else:
            return TeamWriteSerializer</b>
...