Django - Как добавить ограничение на количество комментариев 1

В настоящее время у меня есть функциональность комментариев, и я хочу добавить ограничение на один комментарий для каждого пользователя, но не знаю, как это сделать. Я думал сделать поле 'posted' в модели пользователя, которое будет истинным, когда пользователь публикует комментарий, но я не знаю, как это сделать и, самое главное, если это лучший способ сделать это...

class Comment(models.Model):
    service = models.ForeignKey(Product, on_delete=models.CASCADE, blank=True, null=True, related_name='comments')
    author = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True,)

    content = models.CharField(max_length=200, null=False, blank=True)

    def get_absolute_url(self):
        return reverse('product-feedback', kwargs={'pk': self.pk})
class ProductFeedbackView(DetailView):
    model = Product
    template_name = 'services/product-feedback.html'

    def get_context_data(self , **kwargs):
        data = super().get_context_data(**kwargs)
        connected_comments = Comment.objects.filter(service=self.get_object())
        number_of_comments = connected_comments.count()
        data['comments'] = connected_comments
        data['no_of_comments'] = number_of_comments
        data['comment_form'] = CommentForm()
        return data

    def post(self , request , *args , **kwargs):
        if self.request.method == 'POST':
            comment_form = CommentForm(self.request.POST)
            if comment_form.is_valid():
                content = comment_form.cleaned_data['content']

            new_comment = Comment(content=content, author=self.request.user , service=self.get_object())
            new_comment.save()
            return redirect(self.request.path_info)
        <form action="" method="POST" id="main_form" class="comment_form">
            <div>
                <label for="comment">Type Comment here</label>
                {{ comment_form.content }} {% csrf_token %} <input type="submit" value="Post"></div>
            </div>
        </form>

Если вы действительно уверены, что пользователь должен опубликовать один и только один комментарий, вам следует использовать поле OneToOneField. Таким образом, уникальное ограничение будет создано автоматически, и объектом будет легче управлять.

class Comment(models.Model):
    service = models.ForeignKey(Product, on_delete=models.CASCADE, blank=True, null=True, related_name='comments')
    author = models.OneToOneField(User, on_delete=models.CASCADE, blank=True, null=True,)
    content = models.CharField(max_length=200, null=False, blank=True)

Если вы хотите, чтобы пользователь размещал только один комментарий к каждому продукту, но при этом позволял писать комментарии к любому количеству продуктов, вы должны добавить ограничение в класс Meta :

class Comment(models.Model):
    service = models.ForeignKey(Product, on_delete=models.CASCADE, blank=True, null=True, related_name='comments')
    author = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True,)
    content = models.CharField(max_length=200, null=False, blank=True)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=["service", "author"], name="One comment per user per product")
        ]
Вернуться на верх