代码之家  ›  专栏  ›  技术社区  ›  cclloyd

Django隐式更新所有字段

  •  0
  • cclloyd  · 技术社区  · 7 年前

    在使用django-rest框架时,我有一个方法可以根据输入的表单数据更新模型。

    拼写序列化程序.py:

    from rest_framework import views, serializers, status
    from .models import Spell
    
    class SpellSerializer(serializers.ModelSerializer):
        # Name = serializers.CharField()
        class Meta:
            model = Spell
            # fields = ('id', 'owner', 'Name', 'School', 'Subschool')
            fields = '__all__'
    
        def create(self, validated_data):    
            user = None
            request = self.context.get("request")
            if request and hasattr(request, "user"):
                user = request.user
    
            validated_data['owner'] = user.id
            return Spell.objects.create(**validated_data)
    
        def update(self, instance, validated_data):
            instance.Name = validated_data.get('Name', instance.Name)
            instance.save()
            return instance
    

    如果所有字段的名称都对齐,是否有一种方法可以让模型上的所有字段使用已验证的_数据进行更新?(Aka validated_data.Name 比赛 instance.Name , validated_data.Otherfield 是一样的 instance.Otherfield 而不是必须明确列出所有字段。

    1 回复  |  直到 7 年前
        1
  •  1
  •   neverwalkaloner    7 年前

    可以使用序列化程序 partial=True 争论。在你看来:

    serializer = CommentSerializer(instance, data={'name': 'foo bar'}, partial=True)
    if serializer.is_valid():
        serializer.save()
    

    如果未提供其他字段,则不会引发错误。

    UPD

    如果你的意思是你不想指定 instance.somefield = validated_data['somefield'] 可以在序列化程序中使用以下语法:

    def update(self, instance, validated_data):
        instance.Name = validated_data.get('Name', instance.Name)
        [setattr(instance, k, v) for k, v in validated_data.items()]
        instance.save()
        return instance
    
    推荐文章