HII我是新来的Django的REST框架我能够执行把删除和获取操作,但无法执行后操作
的models.py
class User(auth.models.User, auth.models.PermissionsMixin):
def __str__(self):
return "@{}".format(self.username)
class User_log(models.Model):
user = models.OneToOneField(auth.models.User,on_delete=models.CASCADE,related_name='user_logs')
fullname=models.CharField(max_length=255)
fb_login=models.BooleanField(default=False)
def __str__(self):
return self.fullname
serializers.py
class userSerializers(serializers.ModelSerializer):
password1=serializers.CharField(source="user.password1",write_only=True)
password2=serializers.CharField(source="user.password2",write_only=True)
fullname=serializers.CharField(source='user_logs.fullname')
fb=serializers.BooleanField(source='user_logs.fb_login')
class Meta:
model = User
fields=('id','username','email','password1','password2','fullname','fb')
related_fields = ['user_logs']
def update(self, instance, validated_data):
# Handle related objects
for related_obj_name in self.Meta.related_fields:
data = validated_data.pop(related_obj_name)
related_instance = getattr(instance, related_obj_name)
# Same as default update implementation
for attr_name, value in data.items():
setattr(related_instance, attr_name, value)
related_instance.save()
return super(userSerializers,self).update(instance, validated_data)
urls.py
from django.urls import path,include
from django.contrib.auth import views as auth_views
from . import views
from rest_framework import routers
router=routers.DefaultRouter()
router.register('accounts',views.Userview,basename='user')
app_name = 'accounts'
urlpatterns = [
path('login/', auth_views.LoginView.as_view(template_name="accounts/login.html"),name='login'),
path('logout/', auth_views.LogoutView.as_view(), name="logout"),
path('signup/', views.SignUp.as_view(), name="signup"),
path('password-reset/',
auth_views.PasswordResetView.as_view(
template_name='accounts/password_reset_email.html'
),
name='password_reset'),
path('password-reset/done/',
auth_views.PasswordResetDoneView.as_view(
template_name='accounts/password_reset_done.html'
),
name='password_reset_done'),
path('password-reset-confirm/<uidb64>/<token>/',
auth_views.PasswordResetConfirmView.as_view(
template_name='accounts/password_reset_confirm.html'
),
name='password_reset_confirm'),
path('password-reset-complete/',
auth_views.PasswordResetCompleteView.as_view(
template_name='accounts/password_reset_complete.html'
),
name='password_reset_complete'),
path('',include(router.urls)),
]
views.py
class Userview(viewsets.ModelViewSet):
def get_serializer_class(self):
return userSerializers
def get_queryset(self):
return User.objects.all()
def list(self,request):
queryset = User.objects.all()
serializer=userSerializers(queryset,many=True)
if serializer.is_valid:
return Response(serializer.data)
这是我执行get请求时的json格式
[
{
"id": 1,
"username": "karm",
"email": "[email protected]",
"fullname": "ss",
"fb": false
}
]
正如提到的earliew,每当我执行put delete或使其工作但不是post的情况时,我得到的错误是这样的:
AssertionError at /accounts/accounts/
.create()
默认情况下,该方法不支持可写的点源字段。.create()
为序列化器编写显式方法accounts.serializers.userSerializers
,或read_only=True
在点源序列化器字段上设置。
这里要考虑两点:
write_only
。而是extra_kwargs
在序列化器的Meta
块中使用。create
在序列化器中编写一个方法。下面是一个粗糙的例子。请参阅文档,以获取有关DRF序列化器中只写字段的更多信息。
class userSerializers(serializers.ModelSerializer):
password1=serializers.CharField(source="user.password1")
password2=serializers.CharField(source="user.password2")
fullname=serializers.CharField(source='user_logs.fullname')
fb=serializers.BooleanField(source='user_logs.fb_login')
class Meta:
model = User
fields
fields=['id','username','email','password1','password2','fullname','fb']
related_fields = ['user_logs']
extra_kwargs = {
'password1': {'write_only': True},
'password2': {'write_only': True},
}
def create(self, validated_data): // adjust to fit your actual User model
user = User(
email=validated_data['email'],
username=validated_data['username']
)
user.set_password(validated_data['password'])
user.save()
return user
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句