comment utiliser une expression de jeu de requête dans une clause then dans une annotation conditionnelle dans Django

beren5000

J'ai deux modèles, l'un des organisations et l'autre avec l'adhésion et le rôle d'un utilisateur dans l'organisation

class Organization(models.Model):
    name = models.CharField(blank=False,null=False,max_length=100, unique=True)

class Member(models.Model):
    user_request = models.ForeignKey('accounts.User',on_delete=models.CASCADE,related_name="member_user_request")
    user_second = models.ForeignKey('accounts.User',on_delete=models.CASCADE,blank=True,null=True, related_name="member_user_second")
    role = models.ForeignKey(RoleOrganization,on_delete=models.CASCADE, verbose_name=_('Rol'))
    status = models.ForeignKey(Status,on_delete=models.CASCADE, verbose_name=_('Status'))
    organization = models.ForeignKey(Organization,on_delete=models.CASCADE, verbose_name=_('Organization'))

et j'essaye d'utiliser une clause annoter avec case où je veux obtenir le rôle d'un utilisateur dans l'organisation avec cette expression:

my_organizations = Member.objects.filter(
        Q(user_request_id=self.request.user.id, status__name="accepted", type_request__name="request") |
        Q(user_second_id=self.request.user.id, status__name="accepted", type_request__name="invitation")
    )

Organization.objects.annotate(
        rol=Case(
            When(id__in=list(my_organizations.values_list('organization_id', flat=True)),
                 then=Value(my_organizations.get(organization_id=F('id')).role.name)),
            default=None, output_field=CharField()
        )
    )

le problème ici est que l'expression then n'obtient pas l'id de l'objet dans le jeu de requêtes principal, si je retourne dans le alors juste le F ('id'), l'expression obtient la valeur de l'id dans le jeu de requêtes principal, mais Je peux utiliser un filtre ou toute expression de jeu de requête avec certaines valeurs de l'objet principal.

c'est là un moyen d'accomplir cela. PS: je mets juste une partie du code ici pour la propreté, mais si vous avez besoin d'en savoir plus, faites-le moi savoir

Ruddra

Je pense que vous pouvez le faire comme ceci en utilisant Subquery :

from django.db.models import OuterRef, Subquery

members = Member.objects.filter(
           Q(user_request_id=self.request.user.id, status__name="accepted", type_request__name="request") |
           Q(user_second_id=self.request.user.id, status__name="accepted", type_request__name="invitation")
        )

member_subquery = members.filter(organization=OuterRef('pk'))

organizations = Organization.objects.annotate(member_role=Subquery(member_subquery.values('role')[:1]))

print(organizations.values('member_role'))

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

TOP liste

  1. 1

    Comment exécuter un fichier python avec des droits d'administrateur dans pycharm

  2. 2

    comment obtenir un objet de requête dans les tests unitaires de django?

  3. 3

    mongo kafka connect source

  4. 4

    Vérifier la longueur du nombre à partir du message, puis utiliser la valeur dans l'instruction

  5. 5

    comment convertir une chaîne en un tuple dateutil jour de la semaine sans utiliser eval

  6. 6

    Comment ajouter un texte dans un texte Python/Tkinter

  7. 7

    Aide de variable de débogage pprint jinja2

  8. 8

    Dans les modèles Hugo, comment vérifier la longueur du tableau de fichiers JSON?

  9. 9

    Impression de la longueur du chemin le plus court dans le labyrinthe

  10. 10

    Exécuter la requête externe pour chaque date obtenue à partir de la requête interne

  11. 11

    Recherche de dicton Jinja2 à l'aide d'une clé variable

  12. 12

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

  13. 13

    Comment obtenir l'intégration contextuelle d'une phrase dans une phrase à l'aide de BERT ?

  14. 14

    définir une propriété pour chaque nœud dans neo4j

  15. 15

    Pourquoi cette requête Java échoue-t-elle? renvoyer 0 quand il y a des résultats

  16. 16

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  17. 17

    Laravel 8: Attempt to read property "id" on null

  18. 18

    Comment obtenir tous les champs d'un objet (y compris sa superclasse), à l'aide de l'API Mirrors de Dart?

  19. 19

    Référencement des assemblys de structure .net 4.7 dans la solution .net core 2

  20. 20

    Microsoft.WebApplication.targets

  21. 21

    obtenir le nombre de marqueur affiché sur la carte

chaudétiquette

Archive