【问题标题】:Adding foreign key data through django rest framework serializer通过django rest框架序列化器添加外键数据
【发布时间】:2022-01-13 14:45:15
【问题描述】:

我是 django 的新手,我有两个模型 UserTodoUser 可以有多个待办事项,在创建我想用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'^(\+\d{1,3})?,?\s?\d{8,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})

序列化程序在任何时候都不会得到验证

【问题讨论】:

    标签: python-3.x django rest django-models django-rest-framework


    【解决方案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 是必需的。然后它就会起作用。
    • 我知道我错过了。更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2018-01-11
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    相关资源
    最近更新 更多