如何在Django Rest框架中对嵌套的Serailizer执行发布请求

卡姆维尔·坎古拉(Karmvir Khangura)

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在点源序列化器字段上设置。

麦克风

这里要考虑两点:

  1. DRF序列化器不支持write_only而是extra_kwargs在序列化器的Meta块中使用。
  2. 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

发布请求Django REST框架

如何在Django Rest框架中复制请求

允许在Django REST框架中发布请求

在Django Rest框架中发布请求处理

如何在Django中执行嵌套循环

如何在具有嵌套 JSON 格式的机器人框架中执行补丁请求

如何在Django Rest框架中发布对象数组?

如何在Django Rest框架中保存嵌套关系?

如何在Django Rest框架中向发布方法添加一些cutom代码

如何在 django rest 框架中为嵌套序列化程序正确创建 POST 方法

如何在Django Rest框架中获取非pk值作为发出请求的值

如何在 django rest 框架中访问获取请求数据

如何在 Django rest 框架中执行 UPDATE 和 DELETE 操作

嵌套序列化程序中的Django(1.11)rest框架发布user.id

Django rest框架:在一个发布请求中插入多个对象

如何在Django中测试使用发布请求的视图?

如何在Django REST中通过多对多发布模型

如何在Django rest框架中检索外键字段?

如何在 django rest 框架中更新多个对象?

如何在 django rest 框架中更新 Auth 用户的密码

如何在 Django rest 框架中处理多个文件上传?

如何在Django rest框架中处理ImageFiled?

如何在 Django REST 框架中隐藏 POST 表单?

如何在Django Rest框架中覆盖异常消息

如何在Django Rest框架中解析JSON

如何在Django REST框架gis中获得GeoJSON响应

如何在创建之前验证 Django REST 框架中的输入?

如何在Django REST框架中获取用户?

如何在 django rest 框架中实现不同的用户?