Ernst
Ernst

Reputation: 514

Django ORM When check

I would like to make a query to know whether particular user has relation with specific object. As for example:

user = User.objects.first()
modelA.objects.annotate(has_user=Case(When( XXXXXX, 
     then=Value(True)), default=Value(False), output_field=BooleanField())))

XXXX should be replaced with code which checks whether model_b_set.values_list('user', flat=True) contains given user.

UPDATED

class ModelA(models.Model):
    user = models.ForeignKey('users.User', on_delete=models.CASCADE, related_name='model_a_set')

class ModelB(models.Model):
    modelA = models.ForeignKey('models_a.ModelA', on_delete=models.CASCADE, related_name='model_b_set')
    user = models.ForeignKey('users.User', on_delete=models.CASCADE, related_name='model_b_set')

User model is custom but it will not reflect on other models Also updated example of code in order to fit to my example models

Upvotes: 1

Views: 73

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476740

I think it is better here to use an Exists [Django-doc] with a subquery, like:

from django.db.models import Exists, OuterRef

modelA.objects.annotate(
    is_following_by_user=Exists(
        ModelB.objects.filter(user=my_user, modelA=OuterRef('pk'))
    )
)

Here we thus check per ModelA ojbect if there exists a ModelB for which user is my_user, and modelA is the primary key of that ModelA object.

Upvotes: 1

Related Questions