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()
3 Réponses :
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']
# 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")
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']