Django REST重写destroy方法使用户无效

时间:2017-03-30 11:10:02

标签: django python-3.x django-views django-rest-framework

我试图首先通过userinformations模型中的用户外键访问users表,然后覆盖RetriveUpdateDestroy API视图的destroy方法,将用户的状态更改为非活动状态而不是删除它们。我似乎无法访问内置用户数据库的is-active字段。

views.py

class UserUpdateApiView(RetrieveUpdateDestroyAPIView):
queryset = UserInformation.objects.all()
serializer_class = UserInformationUpdateSerializer
lookup_field = 'pk'
lookup_url_kwarg = 'id'

def destroy(self, request, *args, **kwargs):
    try:
        user = User.objects.get(pk=self.kwargs["id"])
        deleteStatusVal = False
        user.is_active = deleteStatusVal
        user.save()
        return Response(UserSerializer(user).data)
    except:
        return Response("Nope")

serializers.py

class UserSerializer(ModelSerializer):
password = serializers.CharField(style={'input_type': 'password'}, write_only=True)
email = serializers.EmailField(validators=[required])

class Meta:
    model = User
    fields = ['username', 'email', 'password', 'is_active']
    extra_kwargs = {'password': {'write_only': True},
                    'is_active': {'read_only': True}}

def validate(self, data):
    email = data.get('email', None)
    user = User.objects.filter(email=email).distinct()
    if user.exists():
        raise ValidationError("That email is already registered!")
    return data


class UserInformationUpdateSerializer(ModelSerializer):
user = UserSerializer(read_only=True)
class Meta:
    model = UserInformation
    fields = ['user', 'first_name', 'middle_name', 'last_name', 'phone', 'date_of_birth']

models.py

class UserInformation(BaseModel):
user = models.OneToOneField(User, related_name='user_id')
first_name = models.CharField(max_length=45)
middle_name = models.CharField(max_length=45, null=True)
last_name = models.CharField(max_length=45)
vendor = models.BooleanField(default=False)
phone = models.CharField(max_length=100, validators=[
RegexValidator(regex=r'^\+?8801?\d{9}$', message="Phone number must be entered in the format: '+8801*********'")
], blank=False, unique=True)
date_of_birth = models.DateField()
confirmation_token = models.CharField(max_length=45, null=True)
confirmation_exp = models.DateTimeField(null=True)
pw_reminder_token = models.CharField(max_length=45, null=True)
pw_reminder_exp = models.DateTimeField(null=True)
profile_pic = models.ImageField(blank=True, null=True, upload_to='profile_images/', default='Images/none/no_images.jpg')
cover_photo = models.ImageField(blank=True, null=True, upload_to='cover_images/', default='Images/none/no_images.jpg')
thumbnail_pic = models.ImageField(blank=True, null=True, upload_to='thumbnail_images/', default='Images/none/no_images.jpg')
phone_verified = models.BooleanField(default=False)
email_verified = models.BooleanField(default=False)
reward_points = models.IntegerField(null=False)
ref_code = models.CharField(null=True, max_length=10)

def __str__(self):
    return self.user.username

def delete(self, *args, **kwargs):
    self.user.delete()
    super(UserInformation, self).delete(*args, **kwargs)

2 个答案:

答案 0 :(得分:1)

如果要使User处于活动状态,同时保持UserInformation对象和User对象在数据库中未被删除,则可以执行以下操作:

def destroy(self, request, *args, **kwargs):
    user = self.get_object().user
    user.is_active = False
    user.save()
    return Response(UserInformationUpdateSerializer(self.get_object()).data)

答案 1 :(得分:0)

您有'is_active': {'read_only': True}}

此外,

# this seems redundant
def delete(self, *args, **kwargs):
    self.user.delete()
    super(UserInformation, self).delete(*args, **kwargs)