簡體   English   中英

如何驗證 Django 中的當前用戶?

[英]How to Validate Against Current User in Django?

我有關注 model

class User(AbstractBaseUser, PermissionsMixin):

    #: First and last name do not cover name patterns around the globe
    username = CharField(max_length=100,unique=True)
    email = models.EmailField(_('email address'), unique=True)
    full_name = TitleCharField(max_length=100)
    phone_number = PhoneNumberField()
    referred_by = models.ForeignKey('self', on_delete=models.CASCADE)
    is_member = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)

場景是同一用戶不能是用戶並且由用戶推薦。 到目前為止我所做的是

def clean(self):
    if self == self.referred_by:
        raise DjangoValidationError({'referred_by': _('Same user cannot be referred by user')})

我覺得我做的不對,我該怎么辦?

您可以通過使用referred_by的主鍵清理它來提高效率,因為這樣可以避免額外的查詢。 此外,您應該調用super().clean()以便還執行對父類的驗證,並且您還可以嘗試使用Django 的約束框架[Django-doc]在數據庫端強制執行此操作:

from django.core.exceptions import ValidationError
from django.db.models import F, Q

class User(AbstractBaseUser, PermissionsMixin):
    # …
    
    def clean(self, *args, **kwargs):
        if self.pk == self.referred_by_id:
            raise ValidationError('Can not refer to itself!')
        return super().clean(*args, **kwargs)

    class Meta:
        constraints = [
            models.CheckConstraint(
                check=~Q(pk=F('referred_by_id')),
                name='age_gte_18'
            )
        ]

暫無
暫無

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

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