1
votes

Quelle relation dois-je créer dans les modèles pour qu'un utilisateur ne puisse créer qu'un seul commentaire pour le produit?

Voici mes modèles. Quelle est la meilleure approche? OneToOneField permet de créer un seul commentaire pour tous les temps.

class Comment(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    person = models.OneToOneField(Person, on_delete=models.CASCADE)
    text = models.TextField(null=True, blank=True)

class Person(models.Model):
    first_name = models.CharField(
        max_length=512,
        blank=True,
        null=True,
    )
    last_name = models.CharField(
        max_length=512,
        blank=True,
        null=True,
    )
class Product(models.Model):
    slug = SlugField()
    name = NameField()
    description = DescriptionField()


0 commentaires

3 Réponses :


2
votes

Ce que vous voulez, ce sont plusieurs commentaires par utilisateur et plusieurs commentaires par produit. Cependant, vous devez garantir l'unicité des utilisateurs et des produits dans les commentaires. Ceci peut être réalisé en utilisant unique_together (voir https://docs.djangoproject.com/en/2.2/ref/models/options/#unique-together ):

class Comment(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    text = models.TextField(null=True, blank=True)

    class Meta:
        unique_together = ['person', 'product']


0 commentaires

4
votes
# You can use 'unique_together' feature of model

class Product(models.Model):
    slug = SlugField()
    name = NameField()
    description = DescriptionField()

class Comment(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    text = models.TextField(null=True, blank=True)


    class Meta:
        unique_together = ("person", "product")

0 commentaires

1
votes

Je pense que vous devez également ajouter Produit au Commentaire :

class Comment(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    text = models.TextField(null=True, blank=True)

    class Meta:
        unique_together = ['person', 'product']


0 commentaires