Drewes
Drewes

Reputation: 2697

Nested foreignkey query

Using a model like this:

class Folder(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField()

class CanAccess(models.Model):
    folder = models.ForeignKey(Folder)
    user = models.ForeignKey(User)

class Image(models.Model):
    folders = models.ManyToManyField('Folder')
    title = models.CharField()

I need to find all the images that a user can access.

I have tried this, but its not working:

images=Image.objects.filter(folders__canaccess_set__user=current_user)

I get an FieldError when Django looks up the canaccess_set part.

Whats is the best way to make such a query?

Upvotes: 1

Views: 959

Answers (2)

Drewes
Drewes

Reputation: 2697

Ok, the info found here:

http://bitkickers.blogspot.dk/2010/04/django-manytomany-error-cannot-resolve.html

indicated that load order of the model could yield this kind og error, so i changed the models.py file from this order:

class Image(models.Model):
    folders = models.ManyToManyField('Folder')
    title = models.CharField()

class Folder(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField()

class CanAccess(models.Model):
    folder = models.ForeignKey(Folder)
    user = models.ForeignKey(User)

to this order:

class CanAccess(models.Model):
    folder = models.ForeignKey("Folder")
    user = models.ForeignKey(User)

class Image(models.Model):
    folders = models.ManyToManyField('Folder')
    title = models.CharField()

class Folder(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField()

And that actually seems to fix the problem.

Upvotes: 0

Daniel Roseman
Daniel Roseman

Reputation: 599778

You don't need the _set when doing a lookup:

Image.objects.filter(folders__canaccess__user=current_user)

Upvotes: 2

Related Questions