django - 从多对一关系中获取对象集

Posted

技术标签:

【中文标题】django - 从多对一关系中获取对象集【英文标题】:django - Get the set of objects from Many To One relationship 【发布时间】:2013-11-16 23:22:58 【问题描述】:

请看看这些模型:

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)

如何获取特定相册的照片集???以及如何从photo instance 本身获取相册

我试过了:

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

请引导我走向正确的方向。谢谢。

【问题讨论】:

【参考方案1】:

你快到了。你应该使用photo_set 而不是image_set

>>>t_album.photo_set.all() 

即带有_set的小写型号名称

如果您想要 1 个查询中的照片列表,

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

【讨论】:

关于这个的一个问题:如果我遍历 photo_set,我会在每次迭代中对数据库进行一次访问吗(因为 Photo 模型中的相册字段有一个 ForeignKey 到相册)【参考方案2】:

更好的是,你可以写信,Photo

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

photos 将是从 AlbumPhoto 的反向字段的名称。如果不定义,则反向字段将命名为photo_set

然后你使用

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

t_album.photo_set.all()

【讨论】:

以上是关于django - 从多对一关系中获取对象集的主要内容,如果未能解决你的问题,请参考以下文章

Django models 多对一关系中 on_delete 参数的设置

如何防止 EntityType 在与同一实体(父)的多对一关系中显示当前对象?

Hibernate 多对一关联查询

HQL 检索多对一关系中不同实体的列表

JPA - 如何在多对一关系中检查条件

从多对一关系嵌入属性