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
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.
laisse moi dire quelques mots