J'ai deux classes de modèle Django: Ce que je veux faire est ce que je veux faire est le suivant: p> Je suppose que () Utilise une série sémantique, mais comment puis-je contourner cela? J'ai essayé de regarder dans des gestionnaires personnalisés, mais je ne suis pas sûr de ce que c'est la bonne façon (semble compliqué) ... p> Merci d'avance! P> P>
3 Réponses :
Django utilise une DB relationnelle pour son stockage sous-jacent et qui a intrinsèquement des "sémantiques": aucun moyen de contourner cela. Donc, si vous voulez un "multi-jeu" de quoi que ce soit, vous devez le représenter avec un champ numérique qui compte combien de fois chaque élément "se produit". MétéoTomanField ne fait pas cela - donc, au lieu de cela, vous aurez besoin d'une sous-classe de modèle distincte qui indique explicitement l'A et le B qu'elle est relatif et possède une propriété entier pour "compter combien de fois". P>
Je pense que ce n'est pas tout à fait correct. La relation entre A à B est réalisée via une table de relation comprenant trois colonnes: ID, A_ID et B_ID. ID est la clé principale de cette table, il serait donc correct d'avoir trois rangées dans ce tableau, où deux ont la même entrée pour A_ID et B_ID respectivement. Et c'est ce que je veux, mais je ne peux pas comprendre comment dire à Django que ...
@qolin, Sos-Skil's Répondre vous propose un moyen de faire une telle table (pas via plusieurs tomany bien sûr) - mon idée est juste d'ajouter un champ de comptage à cette table plutôt que de compter sur des doublons (c'est juste un moyen plus compact pour Implémenter des multisets alias des sacs).
@Qollin: Je ne suis pas sûr que vous puissiez compter sur une pièce d'identité dans la table de relation - qui peut être un détail de mise en œuvre. Et vous pouvez construire un multiple à plusieurs à utiliser une table "à travers" qui peut avoir des colonnes supplémentaires, telles que le champ de comptage que Alex suggéré.
Un moyen de le faire:
>>> assert C.objects.filter(b=b).count == 3 >>> for c in C.objects.filter(b=b): ... # do something with c.a
Je sais, pas exactement ce que vous recherchez, mais un moyen de faire quelque chose de similaire: /
Je pense que ce que vous voulez, c'est utiliser un modèle intermédiaire pour former la relation M2M à l'aide de l'argument de mots-clés code> dans le multitomanyfield. En quelque sorte comme la première réponse ci-dessus, mais plus "django-y". lorsque vous utilisez le mot-clé Toutefois, vous pourrez toujours utiliser les opérations de requête habituelles sur le modèle contenant le mais peut-être un meilleur exemple est quelque chose comme ceci: p> via code>, les méthodes de manipulation M2M habituelles ne sont plus disponibles ( Cela signifie
ajouter code>,
créer code>,
supprimer code> ou attribution avec
= code> opérateur). Au lieu de cela, vous devez créer le modèle intermédiaire lui-même, comme: p>
HeuresTomanAnfield . En d'autres termes, ce qui suit fonctionnera toujours: p>
>>> B.objects.filter(a__name='Test')