8
votes

Ajout du même objet deux fois à un multiple

J'ai deux classes de modèle Django: xxx

Ce que je veux faire est ce que je veux faire est le suivant: xxx

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é) ...

Merci d'avance!


0 commentaires

3 Réponses :


3
votes

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".


3 commentaires

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é.



2
votes

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


1 commentaires

Je sais, pas exactement ce que vous recherchez, mais un moyen de faire quelque chose de similaire: /



8
votes

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". xxx pré>

lorsque vous utilisez le mot-clé 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> xxx pré>

Toutefois, vous pourrez toujours utiliser les opérations de requête habituelles sur le modèle contenant le HeuresTomanAnfield . En d'autres termes, ce qui suit fonctionnera toujours: p> xxx pré>

mais peut-être un meilleur exemple est quelque chose comme ceci: p>

>>> B.objects.filter(a__name='Test')


0 commentaires