在“跟踪”模型中是否可以阻止自我跟踪?

时间:2020-06-11 11:53:04

标签: python django

我的模型结构如下:

from django.db import models


class Follow(models.Model):
    follower = models.ForeignKey('accounts.User', related_name='following',
                                 on_delete=models.CASCADE)
    user = models.ForeignKey('accounts.User', related_name='followers',
                             on_delete=models.CASCADE)

    class Meta:
        unique_together = (('user', 'follower',),)

    def __str__(self):
        return f'{self.follower.username} follows {self.user.username}'

我正在寻找与“ unique_together”相似但针对同一用户的东西。 我知道有可能在API中阻止它,但我希望它从模型级别开始。

3 个答案:

答案 0 :(得分:1)

您可以:

  • 如其他答案所述,请覆盖clean()save()以确保follower != user
  • 或者如果您使用的是受支持的数据库,则可以add a Check constraint在数据库级别执行相同的操作。

答案 1 :(得分:0)

在这里可以重写save方法。在模型保存方法中,如果关注者和用户相同,则可以检查并引发异常。我认为您不能使用任何约束作为unique_together来做到这一点。

答案 2 :(得分:0)

感谢您的回答,但我是这样做的。

from django.dispatch import receiver
from django.db import models
from django.db.models.signals import pre_save
from django.core.exceptions import ValidationError


class Follow(models.Model):
    follower = models.ForeignKey('accounts.User', related_name='following',
                                 on_delete=models.CASCADE)
    user = models.ForeignKey('accounts.User', related_name='followers',
                             on_delete=models.CASCADE)

    class Meta:
        unique_together = (('user', 'follower',),)

    def __str__(self):
        return f'{self.follower.username} follows {self.user.username}'


@receiver(pre_save, sender=Follow)
def check_self_following(sender, instance, **kwargs):
    if instance.follower == instance.user:
        raise ValidationError('You can not follow yourself')