【问题标题】:How to update Foreign key field using nested serializer in django如何在 django 中使用嵌套序列化程序更新外键字段
【发布时间】:2020-03-04 06:53:46
【问题描述】:

我面临一个使用 django 序列化程序更新模型的问题。

这是我的模型:

class User(models.Model):
    email = models.EmailField(unique=True)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)


class UserProfile(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    designation = models.CharField(max_length=200, blank=True)
    contact_number = models.CharField(max_length=20, blank=True)
    team = models.CharField(max_length=200, blank=True)
    manager = models.CharField(max_length=200, blank=True)
    joining_date = models.DateField(default=datetime.now) 

我需要创建一个序列化程序来编辑当前用户的个人资料详细信息。在此用户详细信息中,例如 designation、contact_number、team、manager、joining_date 位于 UserProfile 模型中,te first_name 和 last_name 位于 User 模型中...。一次编辑两个模型都需要更新

这是我的序列化器。

class UserSerializer(ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'first_name','last_name')


class UserProfileSerializer(ModelSerializer):

    user = UserSerializer()

    class Meta:
        model = UserProfile
        fields = ('id', 'designation', 'contact_number', 'team', 'manager',
              'joining_date','user')

    def update(self, instance, validated_data):
        user = validated_data.get('user')
        instance.user.first_name = user.get('first_name')
        instance.user.save()
        return instance

我收到一个错误{ “用户”:[ “此字段是必需的。” ] }

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    将用户字段更改为DictField。这样就不会被当成外键了。 在to_representation中,序列化用户对象,你会得到你想要的格式的数据。

    class UserSerializer(ModelSerializer):
        class Meta:
            model = User
            fields = ('id', 'first_name','last_name')
    
    
    class UserProfileSerializer(ModelSerializer):
    
        user = serializer.DictField(required=False, write_only=True, default={})
    
        def to_representation(self, instance):
            data = super().to_representation(instance)
            data.update({'user': UserSerializer(instance.user).data})
            return data
    
        class Meta:
            model = UserProfile
            fields = ('id', 'designation', 'contact_number', 'team', 'manager',
                  'joining_date','user')
    
        def update(self, instance, validated_data):
            user = validated_data.get('user')
            instance.user.first_name = user.get('first_name')
            instance.user.save()
            return instance
    

    【讨论】:

    • 我们需要如何在邮递员中测试这个我们需要将它作为行数据还是表单数据来工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 2019-01-30
    • 2016-02-09
    • 2018-11-12
    • 2021-02-13
    • 2015-03-27
    相关资源
    最近更新 更多