Steve Barillas
Steve Barillas

Reputation: 25

Django: Can't query a foreign field

I'm still a novice so any help is gladly appreciated. Running Django 1.10

I'm trying to retrieve all the profiles that are assigned a particular manager but my query set always comes up empty.

Model.py

Blockquote

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    first_name = models.CharField(max_length=30, blank=False)
    last_name = models.CharField(max_length=30, blank=False)
    email = models.EmailField( blank=True, help_text='Optional',)
    receive_email_notifications = models.BooleanField(default=False)
    manager = models.ForeignKey(User, unique=False, blank=True, related_name='+', null=True)

    def get_full_name(self):
        """
        Returns the first_name plus the last_name, with a space in between.
        """
        full_name = '%s %s' % (self.first_name, self.last_name)
        return full_name.strip()


    def publish(self):
        return self.save

    def __str__(self):
        return str(self.user)

View.py

Blockquote

def instrument_list(request):
     # pulls all instruments from instrument model
     instruments = Instrument.objects.all().order_by('instrument_name')
     test = Profile.objects.filter(manager='jenn')
     print(test)

     # pulls all checklists from checklist model
     checklists = Checklist.objects.all().order_by('created_date')
     # takes instruments, pushes them to template with variable 'instruments'
     return render(request, 'blog/instrument_list.html', {'instruments': instruments, 'checklists': checklists})

I've also tried filtering a single profile entry (with a non-foreign key attribute) and printing how managers are saved in the database and the output looked like this

Blockquote

<User: jenn>

However, even when I try filtering with that output, my query sets come up empty

Blockquote

test = Profile.objects.filter(manager='<User: jenn>')

I think I need to adjust my filter parameter to something the database can match against but I'm not sure what that format is. I've tried looking through the documentation but haven't found exactly what I'm looking for.

Upvotes: 2

Views: 40

Answers (2)

Kayf
Kayf

Reputation: 36

I've also tried filtering a single profile entry (with a non-foreign key attribute) and printing how managers are saved in the database and the output looked like this

That's not how managers are saved in databases, thats just a "readable" representation of an instance user.

If you want to filter on a manager you can do something like that :

test = Profile.objects.filter(manager__pk= primary_key_of_manager)

or

temp_manager = User.objects.get(...)
test = Profile.objects.filter(manager=temp_manager)

Upvotes: 0

Daniel Roseman
Daniel Roseman

Reputation: 599788

But that's just a string representation of a model instance. You need the actual instance.

jenn = User.objects.get(username="Jenn")
test = Profile.objects.filter(manager=jenn)

Of course, once you already have jenn as an instance, to can use the reverse accessor of the fk instead:

test = jenn.profile_set.all()

And if you don't have jenn, and you don't need it, you can do the whole thing in one query:

test = Profile.objects.filter(manager__username="Jenn")

Upvotes: 2

Related Questions