Django rest framework 未查找嵌套序列化程序的实例
使用Django Rest Framework 3.1,我有一个案例如下:Django rest framework 未查找嵌套序列化程序的实例,django-rest-framework,Django Rest Framework,使用Django Rest Framework 3.1,我有一个案例如下: # models.py class OrganizationUser(models.Model): user = models.ForeignKey(USER_MODEL) organization = models.ForeignKey(ORGANIZATION_MODEL) # serializers.py class UserSerializer(serializers.ModelSerial
# models.py
class OrganizationUser(models.Model):
user = models.ForeignKey(USER_MODEL)
organization = models.ForeignKey(ORGANIZATION_MODEL)
# serializers.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = get_user_model()
class OrganizationUserSerializer(serializers.ModelSerializer):
user = UserSerializer()
class Meta:
model = OrganizationUser
我简化了上面的一些代码以隔离问题
我遇到的问题是,当我试图通过视图集更新OrganizationUser时,我得到一个验证错误:
{"user":{"username":["This field must be unique."]}}
在调试过程中,我发现该错误是由UniqueValidator引发的,这是因为用户实例未设置在username字段的父级(即UserSerializer)上
因此,我将以下to_internal_值实现添加到OrganizationUserSerializer,然后它正常工作:
def to_internal_value(self, data):
if self.instance:
# set user instance on its serializer
user = self.instance.user
self.fields['user'].instance = user
# make sure correct user is specified in request data
try:
user_id = self.initial_data['user']['id']
except KeyError:
raise fw_serializers.ValidationError('User must be specified')
if user_id != user.id:
raise fw_serializers.ValidationError('Invalid user specified')
return super(OrganizationUserSerializer, self).to_internal_value(data)
但我认为REST框架会自动完成这项工作?不是这样吗?应用程序是否负责查找任何嵌套的序列化程序实例?您可以通过修改UserSerializer的to_internal_value方法来实现此行为:
def to_internal_value(self, data):
if data and data.get('username'):
return self.Meta.model.objects.get(username=data['username'])
return super().to_internal_value(data)
因此,如果您向UserSerializer发送一些数据,其中包含一个用户名作为数据的一部分,那么它将假定您正在发送属于现有对象的数据,查找并返回该数据。您是否专门研究过它,其中解释了如何“序列化中的相关用户字段”?Hi@Charlie:这个问题涉及Django序列化程序,而不是Django REST框架序列化程序(问题标题有误导性,因为自我回答提供了使用Django而不是DRF的“不同方法”)。我刚刚编辑了这个问题,以:(1)提供解决方案,同时仍然提出DRF是否应该自动处理它的问题,和(2)尖锐化问题,将重点放在实例查找上,而不是由于缺少实例而导致的验证错误。您是否尝试使用kwarg?是的,我尝试了queryset kwarg,但它似乎不受支持。我认为queryset只用于ListSerializer和相关字段。