组合序列化程序和模型函数

2024-09-30 16:39:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个序列化程序。。。MyRegisterSerializer继承并扩展了一个流行的应用程序/包django rest auth,它连接到一个相当标准的用户表。我还有一个自定义应用的模型和序列化程序TeamSerializer(与用户的一对多关系)。当用户注册时,我希望他们能够同时加入一个团队,所以我需要创建一个团队,返回团队ID,然后将该ID传递给RegisterSerializer,这样团队的ID就可以存储在user表中。我知道我可以进行两次调用,首先创建团队并返回值,然后将其传递给register序列化程序,但是有没有一种方法可以在一个序列化程序中完成这一切呢?我是python的n00b,考虑到必须返回get_cleaned_data()函数,因此找不到一个很好的例子。谢谢您!在

class TeamSerializer(serializers.ModelSerializer):

  class Meta:
    model = Team
    fields = ('id', 'name', 'logo', 'user')

class MyRegisterSerializer(RegisterSerializer):
  first_name = serializers.CharField()
  last_name = serializers.CharField()

  def get_cleaned_data(self):
    super(MyRegisterSerializer, self).get_cleaned_data()
    return {
        'team_id': <How do I get this value>
        'username': self.validated_data.get('username', ''),
        'position': self.validated_data.get('password1', ''),
        'email': self.validated_data.get('email', ''),
        'first_name': self.validated_data.get('first_name', ''),
        'last_name': self.validated_data.get('last_name', '')
    }

Tags: nameself程序iddataget序列化团队
1条回答
网友
1楼 · 发布于 2024-09-30 16:39:48

这取决于你想如何创建团队:

1。团队由其他信息创建:

您应该能够使用此自定义字段:

from rest_framework.relations import PrimaryKeyRelatedField

class TeamPrimaryKeyRelatedField(PrimaryKeyRelatedField):
    def to_internal_value(self, data):
        if self.pk_field is not None:
            data = self.pk_field.to_internal_value(data)
        try:
            obj, created = self.get_queryset().get_or_create(
                pk=data,
                defaults=get_team_data(),
            )
            return obj
        except (TypeError, ValueError):
            self.fail('incorrect_type', data_type=type(data).__name__)

并在序列化程序中使用它:

^{pr2}$

2。这看起来是writable nested serializers的完美用例:

class TeamSerializer(serializers.ModelSerializer):
    class Meta:
        model = Team
        fields = ('id', 'name', 'logo', 'user')

class MyRegisterSerializer(RegisterSerializer):
  first_name = serializers.CharField()
  last_name = serializers.CharField()
  team = TeamSerializer()

    def create(self, validated_data):
        team_data = validated_data.pop('team')
        # You could do this if the user is not necessary in the team object:
        team = Team.objects.create(**team_data)
        user = super().create(team=team, **validated_data)

        # Otherwise:
        user = super().create(**validated_data)
        # Should this be a many-to-many relationship?
        team = Team.objects.create(user=user, **team_data)
        # I don't know if this works/you need it:
        self.team = team
        # Or it should be like this?
        self.validated_data['team'] = team
        return user

我不知道你到底需要什么。如果你需要进一步的帮助,请告诉我。在

相关问题 更多 >