_set est associé à une relation inverse sur un modèle.
Django permet d'accéder aux relations inverses sur un modèle. Par défaut, Django crée un gestionnaire ( RelatedManager
) sur votre modèle pour gérer cela, nommé <model>_set, où <model> est le nom de votre modèle en minuscule.
Excellent lien sur StackOverflow ici :
https://stackoverflow.com/questions/25386119/whats-the-difference-between-a-onetoone-manytomany-and-a-foreignkey-field-in-d
Si nous avons ces modèles :
class User(models.Model): username = models.CharField(max_length=100, unique=True) companies = models.ManyToManyField('Company', blank=True) class Company(models.Model): name = models.CharField(max_length=255)
en Django,
"Peu importe quel modèle a le ManyToManyField, mais vous ne devriez le mettre que dans l'un des modèles - pas les deux.".
Donc, pour obtenir toutes les entreprises associées à un utilisateur, nous pouvons faire :User.companies.all()
Mais l'inverse est un peu délicat. C'est-à-dire comment associer tous les utilisateurs à une entreprise.
Très facile. Obtenir la relation inverse à l'aide de _setcompany.user_set.all()
renverra un QuerySet d' objets utilisateur appartenant à une société particulière. Par défaut, vous utilisez modelname_set pour inverser la relation, mais vous pouvez l'ignorer en fournissant un related_name comme paramètre lors de la définition du modèle, c'est-à-dire
class User(models.Model): username = models.CharField(max_length=100, unique=True) companies = models.ManyToManyField('Company', blank=True) class Company(models.Model): name = models.CharField(max_length=255)
Ensuite, vous pouvez obtenir l'inverse sans utiliser _set comme ceci :company.users.all()