我希望在串行器中传递 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}
答案 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。在相同情况下,使用括号会引发异常。