Je suis en train de définir mes modèles Django en ce moment et j'ai réalisé qu'il n'y avait pas OneToManyField
de type de champ de modèle. Je suis sûr qu'il existe un moyen de le faire, donc je ne suis pas sûr de ce que je manque. J'ai essentiellement quelque chose comme ça:
class Dude(models.Model):
numbers = models.OneToManyField('PhoneNumber')
class PhoneNumber(models.Model):
number = models.CharField()
Dans ce cas, chacun Dude
peut avoir plusieurs PhoneNumber
s, mais la relation doit être unidirectionnelle, en ce sens que je n'ai pas besoin de savoir à partir de PhoneNumber
qui le Dude
possède, en soi, car je pourrais avoir de nombreux objets différents qui possèdent des PhoneNumber
instances, comme un Business
for exemple:
class Business(models.Model):
numbers = models.OneToManyField('PhoneNumber')
Qu'est-ce que je remplacerais OneToManyField
(qui n'existe pas) dans le modèle pour représenter ce type de relation? Je viens d'Hibernate / JPA où déclarer une relation un-à-plusieurs était aussi simple que:
@OneToMany
private List<PhoneNumber> phoneNumbers;
Comment puis-je exprimer cela dans Django?
la source
dude = models.ForeignKey(Dude, related_name='numbers')
et que vous pouvez utilisersome_dude_object.numbers.all()
pour obtenir tous les numéros associés (si vous ne spécifiez pas de "related_name", il sera par défaut "number_set").Dans Django, une relation un-à-plusieurs est appelée ForeignKey. Cependant, cela ne fonctionne que dans un sens, donc plutôt que d'avoir un
number
attribut de classe,Dude
vous aurez besoinDe nombreux modèles peuvent avoir un
ForeignKey
à un autre modèle, il serait donc valide d'avoir un deuxième attributPhoneNumber
tel queVous pouvez accéder aux
PhoneNumber
s pour unDude
objetd
avecd.phonenumber_set.objects.all()
, puis faire de même pour unBusiness
objet.la source
ForeignKey
signifiait «un pour un». En utilisant votre exemple ci-dessus, je devrais avoir unDude
qui en a beaucoup,PhoneNumbers
non?ForeignKey
n'est qu'un-à-un si vous spécifiezForeignKey(Dude, unique=True)
, donc avec le code ci-dessus, vous obtiendrez unDude
avec plusieursPhoneNumber
s.PhoneNumber
. Maintenant, cela commence à avoir un sens.ForeignKey
est essentiellement plusieurs-à-un, vous devez donc le faire à l'envers pour obtenir un un-à-plusieurs :)phonenumber_set
? Je ne le vois défini nulle part. Est-ce le nom du modèle, en minuscules, accompagné de "_set"?Pour être plus clair - il n'y a pas de OneToMany dans Django, seulement ManyToOne - qui est Foreignkey décrit ci-dessus. Vous pouvez décrire la relation OneToMany en utilisant Foreignkey mais c'est très inexpressif.
Un bon article à ce sujet: https://amir.rachum.com/blog/2013/06/15/a-case-for-a-onetomany-relationship-in-django/
la source
Vous pouvez utiliser une clé étrangère sur plusieurs côtés de la
OneToMany
relation (c'est-à-dire laManyToOne
relation) ou utiliserManyToMany
(de n'importe quel côté) avec une contrainte unique.la source
django
est assez intelligent. En fait, nous n'avons pas besoin de définir leoneToMany
champ. Il sera automatiquement généré pardjango
pour vous :-). Il suffit de définirforeignKey
dans la table associée. En d'autres termes, il suffit de définir laManyToOne
relation en utilisantforeignKey
.si nous voulons obtenir la liste des roues d'une voiture particulière. nous utiliserons
python's
un objet généré automatiquementwheel_set
. Pour la voiture quec
vous utiliserezc.wheel_set.all()
la source
Bien que la réponse de Rolling Stone soit bonne, simple et fonctionnelle, je pense qu'il y a deux choses qu'elle ne résout pas.
Présentez le cadre des types de contenu , qui expose certains objets qui nous permettent de créer une «clé étrangère générique» sur le modèle PhoneNumber. Ensuite, nous pouvons définir la relation inverse sur Dude et Business
Consultez la documentation pour plus de détails et consultez peut-être cet article pour un didacticiel rapide.
Aussi, voici un article qui plaide contre l'utilisation de FK génériques.
la source
Si le modèle «plusieurs» ne justifie pas la création d'un modèle en soi (ce n'est pas le cas ici, mais cela pourrait profiter à d'autres personnes), une autre alternative serait de s'appuyer sur des types de données PostgreSQL spécifiques, via le package Django Contrib
Postgres peut gérer les types de données Array ou JSON , ce qui peut être une bonne solution de contournement pour gérer One-To-Many lorsque les plusieurs-s ne peuvent être liés qu'à une seule entité de l' un .
Postgres vous permet d'accéder à des éléments uniques du tableau, ce qui signifie que les requêtes peuvent être très rapides et éviter les frais généraux au niveau de l'application. Et bien sûr, Django implémente une API intéressante pour tirer parti de cette fonctionnalité.
Il a évidemment l'inconvénient de ne pas être portable vers d'autres bases de données, mais je pense que cela vaut la peine d'être mentionné.
J'espère que cela peut aider certaines personnes à la recherche d'idées.
la source
Tout d'abord, nous faisons un tour:
01) Relation un-à-plusieurs:
NB: Django ne propose aucune relation OneToMany. Nous ne pouvons donc pas utiliser la méthode supérieure dans Django. Mais nous devons nous convertir en modèle relationnel. Alors, que pouvons-nous faire? Dans cette situation, nous devons convertir le modèle relationnel en modèle relationnel inversé.
Ici:
modèle relationnel = OneToMany
Donc, modèle relationnel inversé = ManyToOne
NB: Django supporte la relation ManyToOne & dans Django ManyToOne est représenté par ForeignKey.
02) Relation plusieurs à un:
NB: PENSEZ SIMPLEMENT !!
la source