web-dev-qa-db-ja.com

django-多対1の関係からオブジェクトのセットを取得します

これらのモデルをご覧ください。

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)

特定のアルバムの写真のセットを取得するにはどうすればよいですか?そして、アルバム写真インスタンス自体から取得する方法は?

私はこれを試しました:

# 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'

私を正しい方向に導いてください。ありがとうございました。

17
Aamu

もうすぐです。 photo_setの代わりにimage_setを使用する必要があります

>>>t_album.photo_set.all() 

つまり、_setの小文字のモデル名

1つのクエリで写真のリストが必要な場合は、

photos = Photo.objects.filter(album__user__username='tika')
23
karthikr

さらに良いことに、Photoで書くことができます

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

photosは、AlbumからPhotoへの逆フィールドの名前になります。定義しない場合、逆のフィールドにはphoto_setという名前が付けられます。

次に、

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

または

t_album.photo_set.all()
17
Steve K