1. """
    
  2. Many-to-many relationships
    
  3. 
    
  4. To define a many-to-many relationship, use ``ManyToManyField()``.
    
  5. 
    
  6. In this example, an ``Article`` can be published in multiple ``Publication``
    
  7. objects, and a ``Publication`` has multiple ``Article`` objects.
    
  8. """
    
  9. from django.db import models
    
  10. 
    
  11. 
    
  12. class Publication(models.Model):
    
  13.     title = models.CharField(max_length=30)
    
  14. 
    
  15.     class Meta:
    
  16.         ordering = ("title",)
    
  17. 
    
  18.     def __str__(self):
    
  19.         return self.title
    
  20. 
    
  21. 
    
  22. class Tag(models.Model):
    
  23.     id = models.BigAutoField(primary_key=True)
    
  24.     name = models.CharField(max_length=50)
    
  25. 
    
  26.     def __str__(self):
    
  27.         return self.name
    
  28. 
    
  29. 
    
  30. class NoDeletedArticleManager(models.Manager):
    
  31.     def get_queryset(self):
    
  32.         return super().get_queryset().exclude(headline="deleted")
    
  33. 
    
  34. 
    
  35. class Article(models.Model):
    
  36.     headline = models.CharField(max_length=100)
    
  37.     # Assign a string as name to make sure the intermediary model is
    
  38.     # correctly created. Refs #20207
    
  39.     publications = models.ManyToManyField(Publication, name="publications")
    
  40.     tags = models.ManyToManyField(Tag, related_name="tags")
    
  41.     authors = models.ManyToManyField("User", through="UserArticle")
    
  42. 
    
  43.     objects = NoDeletedArticleManager()
    
  44. 
    
  45.     class Meta:
    
  46.         ordering = ("headline",)
    
  47. 
    
  48.     def __str__(self):
    
  49.         return self.headline
    
  50. 
    
  51. 
    
  52. class User(models.Model):
    
  53.     username = models.CharField(max_length=20, unique=True)
    
  54. 
    
  55.     def __str__(self):
    
  56.         return self.username
    
  57. 
    
  58. 
    
  59. class UserArticle(models.Model):
    
  60.     user = models.ForeignKey(User, models.CASCADE, to_field="username")
    
  61.     article = models.ForeignKey(Article, models.CASCADE)
    
  62. 
    
  63. 
    
  64. # Models to test correct related_name inheritance
    
  65. class AbstractArticle(models.Model):
    
  66.     class Meta:
    
  67.         abstract = True
    
  68. 
    
  69.     publications = models.ManyToManyField(
    
  70.         Publication, name="publications", related_name="+"
    
  71.     )
    
  72. 
    
  73. 
    
  74. class InheritedArticleA(AbstractArticle):
    
  75.     pass
    
  76. 
    
  77. 
    
  78. class InheritedArticleB(AbstractArticle):
    
  79.     pass