如何在序列化程序

时间:2017-12-08 12:32:41

标签: django serialization django-models django-serializer

我希望在串行器中传递 id 值 获取配置文件对象的函数中的id = serializers.IntegerField(label='ID')

def profile_info(self,obj)

  

但是错误 id IntegerField请传递int或   串

任何人都可以告诉我如何在 id 字段中传递值,谢谢。下面是我的序列化代码

class UserSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(label='ID')
    # print ('dadddaaa ',serializers.data)
    profile = serializers.SerializerMethodField('profile_info')
    username = serializers.CharField()
    first_name = serializers.CharField()
    last_name = serializers.CharField()
    # Nazir = serializers.CharField()
    # profile = UsersSerializer(Profile.objects.get(User.objects.get(pk=serializers.data['id'])))
    def profile_info(self, obj): 
        # print ('selffff   ', serializers)
        prof_obj = Profile.objects.get(user=User.objects.get(pk=id))
        return {'id':prof_obj.id}

4 个答案:

答案 0 :(得分:3)

我正在寻找答案,但没有一个对我有用,但是我从django那里得到了它自己

您可以通过使用initial_data来获取它,因为inital_data返回查询字典

self.initial_data['id'] 

答案 1 :(得分:0)

我不建议使用SerializerMethod检索相关的Profile模型,因为这会为每个User激发一个单独的查询。我建议使用nested Serializer作为Profile模型,因此Django / DRF将构建一个JOIN查询。此外,您不必指定每个字段,您可以使用fields类的Meta选项。

首先,请确保在related_name模型中为用户关系指定Profile,以便它可以作为ModelSerializer中的字段进行访问:

user = models.OneToOneField(
    settings.AUTH_USER_MODEL,
    on_delete=models.CASCADE,
    related_name='profile',
)

然后为每个模型创建一个Serializer:

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = ('id', 'ship', 'copilot')


class UserSerializer(serializers.ModelSerializer):
    profile = ProfileSerializer(read_only=True)
    class Meta:
        model = User
        fields = ('id', 'profile', 'username', 'first_name', 'last_name')

这会给你一个像这样的JSON:

{
    "id": 1,
    "profile": {
        "id": 1,
        "ship": "Millennium Falcon",
        "copilot": "Chewbacca"
    },
    "username": "hsolo",
    "first_name": "Han",
    "last_name": "Solo"
}

注意:默认情况下,嵌套关系不可写,但可以完成by creating your own create() and update() functions

答案 2 :(得分:0)

这里的主要问题是您要在此查询中传递一个IntegerField对象作为id:

Profile.objects.get(user=User.objects.get(pk=id))

尝试以下方法:

Profile.objects.get(user=User.objects.get(pk=obj.id))

完整示例:

class UserSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(label='ID')
    # print ('dadddaaa ',serializers.data)
    profile = serializers.SerializerMethodField('profile_info')
    username = serializers.CharField()
    first_name = serializers.CharField()
    last_name = serializers.CharField()
    # Nazir = serializers.CharField()
    # profile = UsersSerializer(Profile.objects.get(User.objects.get(pk=serializers.data['id'])))
    def profile_info(self, obj): 
        # print ('selffff   ', serializers)
        prof_obj = Profile.objects.get(user=User.objects.get(pk=obj.id))
        return {'id':prof_obj.id}

答案 3 :(得分:0)

在Django Rest框架中,每个序列化程序都从上层类Field扩展,因此要获取值,您最常调用to_internal_value或to_representation。当您调用.is_valid时,此过程将在序列号上的每个字段上自动运行。在您的情况下,因为您需要一个字段的值,所以最好的选择是跳过此过程,并使用:

self.initial_data.get("your field name")

这将返回未经验证而传递给串行器的原始值。如果您知道运行serializer.is_valid后将调用函数profile_info,则我建议使用以下方法访问该值:

self.validated_data.get("your field name")

始终使用.get获取字典中的值,因为默认情况下,如果键不存在,则返回None。在相同情况下,使用括号会引发异常。