【问题标题】:Add model field to non-model serializer in Django将模型字段添加到 Django 中的非模型序列化程序
【发布时间】:2019-10-19 07:11:47
【问题描述】:

我正在使用 Django 2.x

我有一个用于验证请求的序列化程序。 (不是模型序列化器)

class ExecuteSerializer(serializers.Serializer):

    database = serializers.IntegerField(required=True)
    query = serializers.CharField(required=True)

    user = serializers.HiddenField(
        default=serializers.CurrentUserDefault()
    )

    def validate(self, attrs):
        user = attrs.get('user', None)

        try:
            database = Database.objects.get(pk=attrs.get('database', None), collection__user=user)
        except Database.DoesNotExist:
            raise ValidationError({
                'database': ['Does not exists']
            })

        attrs['database'] = database
        return attrs

database 是对Database 模型的引用。

我希望用户在 database 字段中传递数据库 ID,但在验证后将转换为 database 对象。

我试图覆盖validate() 方法并将database 对象分配给database 字段,但它给出了错误

TypeError: int() argument must be a string, a bytes-like object or a number, not 'Database'

【问题讨论】:

  • validate() 需要字段值字典
  • 能否提供ExecuteSerializervalidate之后使用的异常堆栈和相关代码?

标签: django django-rest-framework


【解决方案1】:

由于您将IntegerField 用于数据库字段,因此您应该在validate 方法中将int 作为数据库值返回,例如database.id:

def validate(self, attrs):
    user = attrs.get('user', None)

    try:
        database = Database.objects.get(pk=attrs.get('database', None), collection__user=user)
    except Database.DoesNotExist:
        raise ValidationError({
            'database': ['Does not exists']
        })

    attrs['database'] = database.id  # fix is here
    return attrs

【讨论】:

  • 我认为作者应该知道这一点,他只是想重写 validate 方法来获取数据库对象,即使我们不知道为什么。如果没有,这里甚至不需要attrs['database'] = database.id声明,因为attrs中的database只是数据库pk
猜你喜欢
  • 2015-03-12
  • 2017-10-20
  • 2013-08-28
  • 2018-08-03
  • 2017-04-28
  • 2016-08-23
  • 2019-08-28
  • 2013-01-26
  • 1970-01-01
相关资源
最近更新 更多