通过django rest框架序列化器添加外键数据
Posted
技术标签:
【中文标题】通过django rest框架序列化器添加外键数据【英文标题】:Adding foreign key data through django rest framework serializer 【发布时间】:2022-01-13 14:45:15 【问题描述】:我是 django 的新手,我有两个模型 User
和 Todo
。 User
可以有多个待办事项,在创建我想用request.data
传递 user_id 的待办事项时,但在包含 user_id 或用户字段以及request.data
时,我收到Todo
字段的验证错误。
这是User
模型和Todo
模型:
class User(AbstractUser):
email = models.EmailField(unique=True)
password = models.CharField(max_length=128)
username = None
name = models.CharField(max_length=128)
is_email_verified = models.BooleanField(null=True)
mobile = models.CharField(max_length=13, validators=[RegexValidator(regex=r'^(\+\d1,3)?,?\s?\d8,13', message="Enter a valid mobile number")], default='+911234567890')
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['mobile']
class Todo(models.Model):
title = models.CharField(null=False, blank=False, max_length=100)
description = models.TextField(max_length=500)
user = models.ForeignKey(User, on_delete=models.CASCADE, default=0)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
class Meta:
indexes = [
models.Index(fields=['created_at']),
models.Index(fields=['updated_at'])
]
这里是Todoserializer
:
from rest_framework.serializers import ModelSerializer, CharField
from todos.models import Todo
from users.models import User
class TodoSerializer(ModelSerializer):
class Meta:
model = Todo
fields = '__all__'
read_only_fields = ['id', 'created_at', 'updated_at']
这是创建待办事项的视图:
@api_view(['POST'])
def create(request):
user = request.user
todo = TodoSerializer(data= **request.data, 'user': user.pk )
todo.is_valid(raise_exception=True)
todo.save()
return Response(status=status.HTTP_200_OK, data='todo': todo)
序列化程序在任何时候都不会得到验证
【问题讨论】:
【参考方案1】:在您看来尝试:
@api_view(['POST'])
def create(request):
request.data['user'] = request.user
todo = TodoSerializer(data=request.data)
todo.is_valid(raise_exception=True)
todo.save()
return Response(status=status.HTTP_200_OK, data='todo': todo.data)
【讨论】:
request.data 是不可变的,所以我使用 request.data.copy() 复制它并使用可变版本进行操作,但再次将用户分配给 dict 不起作用,它显示@ 987654322@。所以我将字典键"user"
分配给request.user.id
,但上面写着Object of type TodoSerializer is not JSON serializable
@Uzzal H. Mohammad
我建议你看看 CreateApiVIews 以避免这种斗争。
谢谢@Uzzal H. Mohammed,我只是想在您的答案中添加一些更改,我需要使用 request.data 的可变副本在此处添加用户密钥,而变量 todo
不能可以直接 json 序列化,todo.data
是必需的。然后它就会起作用。
我知道我错过了。更新了答案。以上是关于通过django rest框架序列化器添加外键数据的主要内容,如果未能解决你的问题,请参考以下文章
在通过序列化器 django rest 框架时传递额外的数据
Django rest 框架深度序列化器仅在 to_representation 中
在序列化程序中编辑外键字段 - Django Rest Framework