我是django rest_framework的新手,并且已经发布了,我根据django docs扩展了auth_user,但是给了我一个艰难的时间......
models.朋友
class UserProfile(models.Model):
user = models.OneToOneField(User, primary_key=True, on_delete=models.CASCADE)
national_id = models.CharField(max_length=10, blank=True, null=True)
mobile = models.CharField(max_length=10)
pin = models.IntegerField()
pattern = models.IntegerField(blank=True, null=True)
fingerprint = models.CharField(max_length=45, blank=True, null=True)
class Meta:
managed = False
db_table = 'user_profile'
serialize认识.朋友
class UserSerializer(serializers.ModelSerializer):
national_id = serializers.CharField(source='userprofile.national_id', allow_null=True, required=False)
mobile = serializers.CharField(source='userprofile.mobile')
pin = serializers.IntegerField(source='userprofile.pin', write_only=True)
pattern = serializers.IntegerField(source='userprofile.pattern', write_only=True)
fingerprint = serializers.CharField(source='userprofile.fingerprint', write_only=True, allow_null=True, required=False)
class Meta:
model = User
fields = ('id', 'username', 'password', 'first_name', 'last_name', 'email', 'national_id', 'mobile', 'pin', 'pattern', 'fingerprint')
write_only_fields = ('password',)
read_only_fields = ('last_login', 'is_superuser', 'is_staff', 'is_active', 'date_joined')
def create(self, validated_data):
user = User(
username=validated_data['username'],
first_name=validated_data['first_name'],
last_name=validated_data['last_name'],
email=validated_data['email'],
)
user.set_password(validated_data['password'])
user.save()
userprofile = UserProfile(
user=user,
national_id=validated_data['national_id'],
mobile=validated_data['mobile'],
pin=validated_data['pin'],
pattern=validated_data['pattern'],
fingerprint=validated_data['fingerprint'],
)
userprofile.save()
return user
views.朋友
class UserView(viewsets.ModelViewSet):
serializer_class = UserSerializer
queryset = get_user_model().objects
URLs.朋友
from django.conf.urls import include, url
from django.contrib import admin
from rest_framework.routers import DefaultRouter
from restful.views import *
router = DefaultRouter()
router.register(r'availability-notification', AvailabiltyNotificationView)
router.register(r'bank', BankView)
router.register(r'recipient', RecipientView)
router.register(r'user', UserView)
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^admin/', admin.site.urls),
但一直在给我:
环境:
请求方法:POST请求URL:http://localhost:8000/user/
Django版本:1.10.2 Python版本:3.5.2已安装的应用程序:['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django .contrib.messages','django.contrib.staticfiles','rest_framework','restful']已安装的中间件:['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django .middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware “]
追溯:
内部39中的文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ django \ core \ handlers \ exception.py”response = get_response(request)
_get_response 187中的文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ django \ core \ handlers \ base.py”.response = self.process_exception_by_middleware(e,request)
_get_response 185中的文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ django \ core \ handlers \ base.py”。response = wrapped_callback(request,* callback_args,** callback_kwargs)
在wrapped_view 58中输入文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ django \ views \ decorators \ csrf.py”。return view_func(* args,** kwargs)
文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ rest_framework \ viewsets.py”在视图87中。返回self.dispatch(request,* args,** kwargs)
发送474中的文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ rest_framework \ views.py”response = self.handle_exception(exc)
handle_exception 434中的文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ rest_framework \ _ views.py”self.raise_uncaught_exception(exc)
在调度471中的文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ rest_framework \ views.py”.response = handler(request,* args,** kwargs)
在create 21. self.perform_create(serializer)中输入文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ rest_framework \ mixins.py”
perform_create文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ rest_framework \ mixins.py”26. serializer.save()
保存192中的文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ rest_framework \ serializers.py”.self.instance = self.create(validated_data)
创建45. national_id = validated_data ['national_id']中的文件“C:\ Users \ echavez \ Source \ ws \ restful \ serializers.py”,
异常类型:/ user /上的KeyError异常值:'national_id'
我知道这是一个新手问题,但是,我真的需要帮助!
提前致谢。
您以错误的方式获取配置文件数据。 validated_data是您要单独保存的用户和配置文件数据的字典。
得到这样的。
profile_data = validated_data.pop('userprofile')
请注意,我们设置了用户配置文件数据,因此现在您只在validated_data中保留了用户数据。所以完整的流程将如下所示
profile_data = validated_data.pop('userprofile')
user = User.objects.create(**validated_data)
UserProfile.objects.create(user=user, **profile_data)
return user
看看这里
http://www.django-rest-framework.org/api-guide/serializers/#writable-nested-representations
感谢LaL ZaDa指出了我正确的方向,我的代码终于看起来像这样并且有效:
serialize认识.朋友
class UserSerializer(serializers.ModelSerializer):
national_id = serializers.CharField(source='userprofile.national_id', allow_null=True, required=False)
mobile = serializers.CharField(source='userprofile.mobile')
pin = serializers.IntegerField(source='userprofile.pin', write_only=True)
pattern = serializers.IntegerField(source='userprofile.pattern', write_only=True)
fingerprint = serializers.CharField(source='userprofile.fingerprint', write_only=True, allow_null=True, required=False)
bank_accounts = UserBankAccountSerializer(many=True)
class Meta:
model = User
fields = ('id', 'username', 'password', 'first_name', 'last_name', 'email', 'national_id', 'mobile', 'pin', 'pattern', 'fingerprint', 'bank_accounts')
write_only_fields = ('password',)
read_only_fields = ('last_login', 'is_superuser', 'is_staff', 'is_active', 'date_joined')
def create(self, validated_data):
user = User(
username=validated_data['username'],
first_name=validated_data['first_name'],
last_name=validated_data['last_name'],
email=validated_data['email'],
)
user.set_password(validated_data['password'])
user.save()
profile_data = validated_data.pop('userprofile')
userprofile = UserProfile(
user=user,
national_id=profile_data['national_id'],
mobile=profile_data['mobile'],
pin=profile_data['pin'],
pattern=profile_data['pattern'],
fingerprint=profile_data['fingerprint'],
)
userprofile.save()
return user
原因,这不是一个嵌套模型(bank_accounts,是嵌套的),所以当我这样做时:
profile_data = validated_data.pop('userprofile')
user = User.objects.create(**validated_data)
UserProfile.objects.create(user=user, **userprofile)
return user
扔我...
环境:
请求方法:POST请求URL:http://localhost:8000/user/
Django版本:1.10.2 Python版本:3.5.2已安装的应用程序:['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django .contrib.messages','django.contrib.staticfiles','rest_framework','restful']已安装的中间件:['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django .middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware “]
追溯:
内部39中的文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ django \ core \ handlers \ exception.py”response = get_response(request)
_get_response 187中的文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ django \ core \ handlers \ base.py”.response = self.process_exception_by_middleware(e,request)
_get_response 185中的文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ django \ core \ handlers \ base.py”。response = wrapped_callback(request,* callback_args,** callback_kwargs)
在wrapped_view 58中输入文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ django \ views \ decorators \ csrf.py”。return view_func(* args,** kwargs)
文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ rest_framework \ viewsets.py”在视图87中。返回self.dispatch(request,* args,** kwargs)
发送474中的文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ rest_framework \ views.py”response = self.handle_exception(exc)
handle_exception 434中的文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ rest_framework \ _ views.py”self.raise_uncaught_exception(exc)
在调度471中的文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ rest_framework \ views.py”.response = handler(request,* args,** kwargs)
在create 21. self.perform_create(serializer)中输入文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ rest_framework \ mixins.py”
perform_create文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ rest_framework \ mixins.py”26. serializer.save()
保存192中的文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ rest_framework \ serializers.py”.self.instance = self.create(validated_data)
创建49中的文件“C:\ Users \ echavez \ Source \ ws \ restful \ serializers.py”。user = User.objects.create(** validated_data)
在manager_method 85中输入文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ django \ db \ models \ manager.py”。返回getattr(self.get_queryset(),name)(* args,** kwargs)
在create 397中输入文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ django \ db \ models \ query.py”.obj = self.model(** kwargs)
init 68中的文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ django \ contrib \ auth \ base_user.py”.super(AbstractBaseUser,self).init(* args,** kwargs)
在init 550中文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ django \ db \ models \ base.py”.setattr(self,prop,kwargs [prop])
文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ django \ db \ models \ fields \ related_descriptors.py”in set 500. manager.set(value)
在集合687中的文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ django \ db \ models \ fields \ related_descriptors.py”.self.add(* objs,bulk = bulk)
文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ django \ db \ models \ fields \ related_descriptors.py”添加597. self.field.name:self.instance,
更新637中的文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ django \ db \ models \ query.py”。rows = query.get_compiler(self.db).execute_sql(CURSOR)
execute_sql 1148中的文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ django \ db \ models \ sql \ compiler.py”。cursor = super(SQLUpdateCompiler,self).execute_sql(result_type)
execute_sql 824中的文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ django \ db \ models \ sql \ compiler.py”.sql,params = self.as_sql()
在as_sql 1102. val.prepare_database_save(field)中输入文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ django \ db \ models \ sql \ compiler.py”,
在prepare_database_save 999中输入文件“C:\ Users \ echavez \ Envs \ YEiPii \ lib \ site-packages \ django \ db \ models \ base.py”。raise ValueError(“未保存的模型实例%r不能在ORM查询中使用。 “%自我)
异常类型:ValueError at / user / Exception值:未保存的模型实例不能在ORM查询中使用。
现在我将完成创建以包含嵌套的一个以及更新和删除...
谢谢LaL