3

在这里,我不是从数据库中删除模型对象。我只是is_deleted在删除时将状态更改为 True。但是,这样做unique=True会给已删除的对象带来错误,那么我该如何处理呢?

我想is_deleted=True从唯一的 True 中排除对象。

class MyModel(models.Model):
    name = models.CharField(max_length=20, unique=True)
    is_deleted = models.BooleanField(default=False)


#views
class MyViewSet(ModelViewSet):

    serializer_class = MySerializer
    queryset = MyModel.objects.all()

    def destroy(self, request, *args, **kwargs):
        object = self.get_object()
        object.is_deleted = True
        object.save()
        return Response(status=status.HTTP_204_NO_CONTENT)
4

3 回答 3

7

您可以使用带有条件的UniqueConstraint[Django docs]而不是现场的uniquekwarg。尽管有一个警告,对于具有条件的唯一约束,验证(通过表单等)不会自动完成,您需要自己进行验证。

from django.db.models import Q


class MyModel(models.Model):
    name = models.CharField(max_length=20)
    is_deleted = models.BooleanField(default=False)
    
    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['name'], condition=Q(is_deleted=False), name='unique_undeleted_name')
        ]
于 2021-05-05T09:00:27.587 回答
3

开始,您可以使用Django 的约束 API,然后可以指定具有条件的UniqueConstraint[Django-doc]

class MyModel(models.Model):
    #            no unique=True ↓
    name = models.CharField(max_length=20)
    is_deleted = models.BooleanField(default=False)

    class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=['name'],
                name='unique_name_not_deleted',
                condition=Q(is_deleted=False)
            )
        ]

当然是数据库强制执行此功能,因此某些数据库可能没有实现该功能。

于 2021-05-05T09:00:36.347 回答
0

您也可以使用以下

class Meta:
       unique_together = ("name", "is_deleted")
于 2021-05-05T09:07:21.367 回答