0

I have three models in my Django app.

# models.py 
class Membership(models.Model):
    field1
    field2

class MembershipServiceDetails(models.Model):
    membership = models.ForeignKey(Membership, on_delete=models.CASCADE,related_name="msd_services")
    service = models.ForeignKey(Service,blank=True, null=True, on_delete=models.CASCADE)
    field3

class MembershipSubscriber(models.Model):
    membership = models.ForeignKey(Membership, blank=True, null=True, on_delete=models.CASCADE)
    customer = models.ForeignKey(Customer, blank=True, null=True, on_delete=models.CASCADE)
    field4

Now I want to query the service data with customers details. But the models are related through Membership only.

I'm trying something like this

    service_details = MembershipServiceDetails.objects.select_related('membership', 'service').annotate(
        service_data=F('membership').membershipsubscriber_set.first()
    )

Obviously it didn't work. How can this be achieved? Any help would be appreciated.

danish2694
  • 199
  • 3
  • 16
  • Can you explain what value you are trying to get? Your are mixing `annotate`, `membershipsubscriber_set` and `first()` which typically aren't used in the order you're using them – 0sVoid Jul 20 '22 at 10:50
  • I'm trying to get services data and customers data which is in two different models. If I do something like this ```for service_data in service_details: membership_data = service_data.membership.membershipsubscriber_set.first()``` it works as expected. So I was wondering it it is possible to make reverse lookup with the queryset instead of iterating objects. – danish2694 Jul 20 '22 at 10:53
  • I think you need to use `Subquery`... see https://stackoverflow.com/a/60217311/202168 and https://docs.djangoproject.com/en/4.0/ref/models/expressions/#django.db.models.Subquery – Anentropic Jul 20 '22 at 10:56
  • You won't be able to annotate a MembershipSubscriber object onto your MembershipServiceDetails queryset - though you could get the PK, but I don't think that's what you want. Personally I think your model relations aren't structured quite right - I would put a FK on Membership to MembershipSubscriber - you then remove the `membershipsubscriber_set.first()` and just do `membershipsubscriber` – 0sVoid Jul 20 '22 at 11:11

0 Answers0