当前位置: 首页 > 知识库问答 >
问题:

在执行验证时向Django模型序列化程序添加提取字段

梁豪
2023-03-14

假设我有以下模型,和模型序列化器:

模型。派克

class Approve(models.Model):
    process = models.IntegerField(verbose_name='Associated Process')
    content = models.CharField(max_length=300, verbose_name="Approval Content")

serializers.py

class ApproveSerializer(serializers.ModelSerializer):
    class Meta:
        model = Approve
        fields = ('id', 'process' ,'content')
    def validate(self, value):
        process = value['process']
        try:
            something_else = Something.objects.get(process)
        except Something.DoesNotExist:
            raise serializers.ValidationError('Invalid Process')
        return value

问题是我想在views.py中使用这个对象something_else,而不是进行另一个数据库查询。有什么方法可以通过串行化程序传递它,而不会在调用serializer.is_valid()方法时导致串行化程序验证错误。

共有2个答案

孔瑾瑜
2023-03-14

我想出了解决这个问题的方法。

serializers.py

class ApproveSerializer(serializers.ModelSerializer):
    class Meta:
        model = Approve
        fields = ('id', 'process' ,'content')
    def validate(self, value):
        process = value['process']
        try:
            something_else = Something.objects.get(process)
            value['something_else'] = something_else
        except Something.DoesNotExist:
            raise serializers.ValidationError('Invalid Process')
        return value

意见。在调用序列化程序之前。方法,则应弹出已添加到序列化程序的值。

def post(self, request):
    serializer = ApproveSerializer(data=request.data)
    if serializer.is_valid():
        something_else = serializer.validated_data.pop('something_else')
        something_else.property = new_property
        something_else.save()
        serializer.save()
    else:
        # Error handling goes here serialzier.errors

我不确定这是一个好的做法,但至少现在对我来说是有效的。希望知道更好的解决办法。

韩征
2023-03-14

我不确定你的views.py看起来怎么样,但本质上,你需要在那里实例化序列化器:

def approve_view(request):
    if request.method == "POST":
        process = request.POST.get('value', None)
        something_else = Something.objects.filter(process=process).first()
        serializer = ApproveSerializer(something_else=something_else) # This is where you pass the something_else object. 
        if serializer.is_valid():
             # Your code for successful validation.
        else:
             # Your code for failed validation

现在,您已经将something_else传递到ProveSerializer,您需要将其设置为属性:

class ApproveSerializer(serializers.ModelSerializer):
    def __init__(self, something_else=None):
        self.something_else = something_else

    class Meta:
        model = Approve
        fields = ('id', 'process' ,'content')

    def validate(self, value):
        process = value['process']
        if not self.something_else:
             raise serializers.ValidationError('Invalid Process')
    return value
 类似资料:
  • 我用的是Django 2。十、 我有一个用于验证请求的序列化程序。(不是ModelSerializer) 是对模型的引用。 我希望用户在字段中传递数据库id,但在验证后,got被转换为对象。 我试图重写方法,并将对象分配给字段,但它给出了错误

  • def validate_mobile_number(value):如果不是str(value).isdigit():引发ValidationError(“请输入有效的手机号码”)类ModelA(AbstractUser): mobile=models.CharField(u(“mobile”),unique=True,max_length=10,验证器[validate_mobile_numbe

  • 问题内容: 情况 在Django REST Framework的验证中工作时,我注意到字段总是被验证,即使这样做不一定有意义。以以下示例进行模型的序列化: 我有一个创建用户的端点。因此,有一个领域和一个领域。如果两个字段不匹配,则无法创建用户。同样,如果所请求的已经存在,则无法创建用户。 用户为上述每个字段发布了不正确的值 已在序列化程序中实现的实现(请参见下文),以捕获不匹配和字段 实施: 问题

  • 问题内容: 我有一个带有开始和结束日期范围的Django模型。我想强制执行验证,以便没有两个记录具有重叠的日期范围。最简单的实现方式是什么,这样我就不必重复编写逻辑了? 例如,我不想在Form 和 a 以及 admin表单中重新实现此逻辑, 并且 模型被重写。 据我所知,Django在全球范围内强制执行这些类型的条件并不容易。 Googling并不是很有帮助,因为“模型验证”通常是指验证特定的模型

  • 问题内容: 我使用的是Django Rest Framework,其中有以下两个序列化器: ServiceType模型如下所示: 我想通过更改相关服务(例如删除其中的一些服务)来更新现有实例。为此,我正在这样做: 我面临的问题是没有提供该字段-这意味着我得到了-尽管我在 字段中明确添加了该字段。 编辑 这是我发布的一个示例性请求(来自Chrome): 我在做什么错以及如何使用嵌套序列化程序获取对象

  • 问题内容: 我找不到在Gson进行序列化期间添加自定义字段的简单方法,我希望其他人可以提供帮助。 这是一个示例类来展示我的问题: 当我序列化类AI时,想返回以下内容: 其中url_to_user未存储在我的类A的实例中,但可以与数据一起在类A的实例中生成。 有没有简单的方法可以做到这一点?我宁愿避免只添加一个字段就编写整个序列化程序。 问题答案: 用得到,用它可以动态交互。