Почему я получаю ошибку при попытке создать статью для дочернего пользователя?
Вот в чем проблема: Когда я пытаюсь создать статью для самого пользователя, это работает. Но когда я пытаюсь создать статью в качестве родителя дочернего пользователя, а не самого пользователя, я получаю ошибку проверки. Я пытаюсь убедиться, что родитель является аутентифицированным пользователем. Как я могу решить эту проблему?
class User(AbstractUser,PermissionsMixin):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
email = models.CharField(max_length=255,unique=True)
username =models.CharField(max_length=40,unique=True,default='undefinedusername')
parent = models.ForeignKey('self',on_delete=models.CASCADE,null=True, blank=True)
class Article(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
author = models.ForeignKey(User,on_delete=models.CASCADE,related_name='articles')
caption = models.CharField(max_length=250)
class ArticleCreateSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ('id','author','caption')
def validate(self, attrs):
attrs = super().validate(attrs)
if attrs['author'].id != self.context['request'].user.pk:
raise ValidationError('Unauthorized Request')
elif attrs['author'].parent.id == self.context['request'].user.pk:
return attrs
elif (attrs.get('author').parent != None) and (attrs.get('parent').id != self.context['request'].user.pk):
raise ValidationError('Unauthorized Request')
return attrs
Я нашел проблему. Мне пришлось изменить функции валидации таким образом:
Изменяем функцию validate на следующую:
def validate(self, attrs):
attrs = super().validate(attrs)
if attrs['author'].id == self.context['request'].user.pk:
return attrs
elif attrs.get('author').parent.id == self.context['request'].user.pk:
return attrs
raise ValidationError('Unauthorized Request')
Позвольте мне объяснить, почему я столкнулся с проблемами:
Если бы любое из условий IF было истинным, а остальные ложными, я бы получил false, поэтому мне пришлось изменить проверку валидности, чтобы она проверяла все условия, а затем выдавала ошибку, если ни одно из них не совпадает.
Почему я исключил некоторые функции, очень просто:
1- elif attrs['author'].parent.id == self.context['request'].user.pk:
return attrs
2- elif (attrs.get('author').parent != None) and (attrs.get('parent').id != self.context['request'].user.pk):
raise ValidationError('Unauthorized Request')
Номер 1 был просто беспорядком
В номере 2 мне не нужно было проверять, есть ли у пользователя родитель. Если у родителя есть аутентификация, валидация может быть пройдена. Проверка существования или отсутствия родителя может быть хорошим аргументом, но она чревата ошибками.