Пользователю не может понравиться его / ее собственный комментарий - ограничение БД - Django - PullRequest
0 голосов
/ 28 января 2020

Это мои модели:

class Post(models.Model):

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['user'], condition=Q(is_featured=True), name='unique featured post per user'),
        ]

    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=255)
    post = models.TextField()
    is_featured = models.BooleanField(default=False)


class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    title = models.CharField(max_length=255)
    comment = models.CharField(max_length=500)


class Like(models.Model):
    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['user', 'comment'], name='unique like per comment'),
        ]

    user = models.ForeignKey(User, on_delete=models.CASCADE)
    comment = models.ForeignKey(Comment, on_delete=models.CASCADE)
    is_positive = models.BooleanField(blank=True, null=True)

ЦЕЛЬ:

Я хотел бы добавить ограничение, когда user не может понравиться его собственный комментарий.

Я пытался, но, конечно, я не могу сделать это:

models.UniqueConstraint(fields=['user'], condition=~Q('user__id__in'=Like.objects.values_list('user_id', flat=True), name='unique like per comment'),

1 Ответ

1 голос
/ 28 января 2020

Невозможно поместить подобное ограничение на уровне базы данных, как указано в руководстве :

PostgreSQL не поддерживает ограничения CHECK, которые ссылаются на данные таблицы кроме проверяемой новой или обновленной строки

Поэтому я предлагаю проверить на уровне модели: https://docs.djangoproject.com/en/3.0/ref/models/instances/#validating -объекты

...