Query using related name in django

Question:

I’ve two models:

class User(models.Model):
    email = models.EmailField()
    name = models.CharField(max_length=255)
    password = models.CharField(max_length=255)

class Profile(models.Model):
    group = models.ForeignKey(User, related_name='profiles')
    image = models.ForeignKey(Media, on_delete=models.CASCADE)
    #more attributes

I’ve user’s id and I want to get his image.

user = User.objects.get(id=id)
image = user.profiles.image

This is throwing error. How can I do it?

Asked By: Arthur Dayne

||

Answers:

The reason for the error is that your User to Profile relation is many-to-one, so when you call user.profiles it is creating a queryset of possibly many Profile objects and not just one. The queryset of profiles does not have an image attribute.

You need to do one of two things, either:

a) Extract a single profile from your profiles queryset, e.g. user.profiles.first() – note that if you have multiple profiles then this will just get the first one in the set by whichever order_by the profile model has.

b) Set the User/Profile relationship to one-to-one rather than many-to-one by using a models.OneToOneField. This will allow you to directly access the profile with user.profile

Once you have direct access to the profile object, you can call the image attribute that it has.

Answered By: 0sVoid
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.