django - Get the set of objects from Many To One r

2019-03-18 18:51发布

Please have a look at these models:

class Album(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=200)
    pub_date = models.DateTimeField(default=datetime.now)


class Photo(models.Model):
    album = models.ForeignKey(Album, default=3)
    image = models.ImageField(upload_to=get_upload_file_name)
    caption = models.CharField(max_length=200)
    pub_date = models.DateTimeField(default=datetime.now)

How do I get the the set of photos for a particular album??? And how to get the Album from the photo instance itself?

I tried this:

# To get the set of photos from the user (tika) album:
>>>t = User.objects.get(username='tika')
>>>t_album = Album.objects.get(user=t)
>>>t_album 
<Album: tika_album>
>>>t_album.image_set.all()
AttributeError: 'Album' Object has no attribute 'image_set'

Please guide me to the right direction. Thank you.

2条回答
啃猪蹄的小仙女
2楼-- · 2019-03-18 19:17

Even better, you can write, in Photo

album = models.ForeignKey(Album, related_name='photos', default=3)

The photos will be the name of the reverse field from Album to Photo. If you don't define it, the reverse field will be named photo_set.

You then use

t_album.photos.all()  # only if you've defined the `related_name` argument to 'photos'

or

t_album.photo_set.all()
查看更多
爷、活的狠高调
3楼-- · 2019-03-18 19:22

You are almost there. you should be using photo_set instead of image_set

>>>t_album.photo_set.all() 

i.e the lowercase modelname with _set

If you want the list of photos in 1 query,

photos = Photo.objects.filter(album__user__username='tika')
查看更多
登录 后发表回答