DJANGO REST API:非空约束失败

DJANGO REST API:非空约束失败,django,rest,Django,Rest,我正在DJANGO REST API中开发一个用户首选项视图集,用户可以在更新首选项的同时获得一个首选项列表。在Postman中,我可以获取用户的首选项,但当我转到“put”时,我会得到以下错误:完整性错误--非空约束失败:pugorugh_userpref.age--发生这种情况的原因是什么 UserPref模型如下所示: class UserPref(models.Model): user = models.ForeignKey(User) age = models.Char

我正在DJANGO REST API中开发一个用户首选项视图集,用户可以在更新首选项的同时获得一个首选项列表。在Postman中,我可以获取用户的首选项,但当我转到“put”时,我会得到以下错误:完整性错误--非空约束失败:pugorugh_userpref.age--发生这种情况的原因是什么

UserPref模型如下所示:

class UserPref(models.Model):
    user = models.ForeignKey(User)
    age = models.CharField(choices=AGE, max_length=7, default='b,y,a,s')
    gender = models.CharField(choices=GENDER_PREF, max_length=3, default='m,f')
    size = models.CharField(choices=SIZE_PREF, max_length=8, default='s,m,l,xl')

    def __str__(self):
        return '{} preferences'.format(self.user)


def create_user_preference(sender, **kwargs):
    user = kwargs['instance']

    if kwargs['created']:
        user_pref = UserPref(user=user)
        user_pref.save()

post_save.connect(create_user_preference, sender=User)
这是我的视图集:

class UserPrefViewSet(
    mixins.RetrieveModelMixin,
    mixins.UpdateModelMixin,
    viewsets.GenericViewSet):
    """View to get and update User Preferences."""
    permission_classes = (permissions.IsAuthenticated,)
    queryset = models.UserPref.objects.all()
    serializer_class = serializers.UserPrefSerializer

    # /api/user/preferences/
    @list_route(methods=['get', 'put'])
    def preferences(self, request, pk=None):
        user = request.user
        user_pref = models.UserPref.objects.get(user=user)

        if request.method == 'PUT':
            data = request.data
            user_pref.age = data.get('age')
            user_pref.gender = data.get('gender')
            user_pref.size = data.get('size')
            user_pref.save()

        serializer = serializers.UserPrefSerializer(user_pref)
        return Response(serializer.data)
和序列化程序

class UserPrefSerializer(serializers.ModelSerializer):
    extra_kwargs = {
        'user': {'write_only': True}
    }

    class Meta:
        fields = (
            'age',
            'gender',
            'size'
        )
        model = models.UserPref

看起来PUT数据不包含
age
值。由于
age
字段不可为空,空白的age值将引发错误。 尝试修复此问题:

user_pref.age = data.get('age') or user_pref.age
...
user_pref.save()
如果值不在请求数据中,则允许不更改
age