簡體   English   中英

如何更改 django model 中的 unique true 的行為?

[英]How to change the behaviour of unique true in django model?

這里我不是從數據庫中刪除 model 對象。 我只是在刪除時將is_deleted狀態更改為 True。 但是,這樣做時unique=True會為已刪除的對象提供錯誤,那么我該如何處理呢?

我想從唯一的 True 中排除is_deleted=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)

您可以使用帶有條件的UniqueConstraint [Django docs] ,而不是字段上的unique kwarg。 盡管有一個警告,驗證(通過 forms 等)不會針對具有條件的唯一約束自動完成,您需要自己進行驗證。

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')
        ]

由於 ,您可以使用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)
            )
        ]

當然是數據庫強制執行此功能,因此某些數據庫可能沒有實現該功能。

您也可以使用以下內容:

class Meta:
       unique_together = ("name", "is_deleted")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM