如何在 Django 模型中改变 unique true 的行为?

D_P*_*D_P 3 python django django-rest-framework

在这里,我没有从数据库中删除模型对象。我只是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)
Run Code Online (Sandbox Code Playgroud)

Abd*_*kat 6

您可以使用带有条件的UniqueConstraint[Django docs]而不是unique字段上的 kwarg。尽管有一个警告,即验证(通过表单等)不会自动完成具有条件的唯一约束,您需要自己完成。

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')
        ]
Run Code Online (Sandbox Code Playgroud)

  • 哈哈:我们在几分钟内回答了几乎完全相同的问题:p (2认同)
  • @WillemVanOnsem 是的;)似曾相识,如果我没记错的话,也发生在几天前。 (2认同)
  • @D_P 是的,您需要向序列化器添加一个“validate_name”方法来自己验证这一点,不幸的是,验证中内置的模型无法处理此问题。 (2认同)