Python Django::引用外键

Python Django::引用外键,python,django,one-to-many,Python,Django,One To Many,我想创建一个网页,在那里我可以通过网页上的图片显示属性 当前,我的属性模型如下所示(删除了一些代码): 图像模型 class Picture(models.Model): location = models.CharField(max_length=255) owner = models.ForeignKey(User) active = models.BooleanField(default=True) alt = models.CharField(max_le

我想创建一个网页,在那里我可以通过网页上的图片显示属性

当前,我的属性模型如下所示(删除了一些代码):

图像模型

class Picture(models.Model):
    location = models.CharField(max_length=255)
    owner = models.ForeignKey(User)
    active = models.BooleanField(default=True)
    alt = models.CharField(max_length=100)
    parent_property = models.ForeignKey(Property, null=True)
    timestamp = models.DateTimeField(default=timezone.now)
在我看来,我得到的对象列表如下:

room_list = Property.objects.all().filter(type='Room').order_by('timestamp')[6]
{% for room in room_list %}
   <img src="{{ room.picture_set.first }}"/>
{% endfor %}
room_list = Property.objects.filter(
    type='Room'
).prefetch_related(
    'picture_set'
)
在通过传递的room_列表运行for循环时,我希望像这样引用它

房间图片的第一张图片列表

我试图浏览Django关于一对多关系的官方文档,但我似乎无法理解


如何实现这一点?

房间列表。图片集。all()是访问图片集的方式。要获取第一个,您只需访问
room\u list.picture\u set.first()
。模板版本:
{{room\u list.picture\u set.first}


在这里简单回答您的问题:

{% for room in room_list %}
   <img src="{{ room.picture_set.first }}"/>
{% endfor %}
您可能需要
[:6]

另外,您不需要在
.filter()之前调用
.all()


尽管您可以使用以下内容:

room_list = Property.objects.all().filter(type='Room').order_by('timestamp')[6]
{% for room in room_list %}
   <img src="{{ room.picture_set.first }}"/>
{% endfor %}
room_list = Property.objects.filter(
    type='Room'
).prefetch_related(
    'picture_set'
)
这将导致一个查询。当然,还有其他方法可以达到同样的效果,但这些方法更复杂

提示:您不需要按时间戳字段排序(除非您修改它的值),但可以使用按顺序创建的ID。这是一种更便宜的操作(至少在博士后)

更新: 正如@JamesLin所建议的,您可以使用如下内容:

room_list = Property.objects.all().filter(type='Room').order_by('timestamp')[6]
{% for room in room_list %}
   <img src="{{ room.picture_set.first }}"/>
{% endfor %}
room_list = Property.objects.filter(
    type='Room'
).prefetch_related(
    'picture_set'
)

这将被转换为两个查询,一个用于属性列表,另一个用于与所拉属性项相关的所有图片记录(Django将以编程方式连接它们)。这对于程序员来说是相当懒惰的,但是要考虑的是加载每个属性的所有图片记录。但这肯定是一个比图片集更好的解决方案,而且比我的第一个建议更容易实施(这并不意味着这是一个更好的解决方案)。

房间列表和图片集来自哪里?它们是自动生成的变量吗?room_list是您在视图中提到的变量。它的名称其实并不重要,只要将它添加到发送到模板的请求中即可。图片集是自动生成的(按照我答案中的链接)。我尝试使用此解决方案,添加了默认的图片=models.ForeignKey(图片),但schemamigration给了我一个错误,说它找不到图片您可以只添加与选择相关的()如果不添加额外的字段,因为您很可能会将结果分页到大约10条记录,假设您每栋房子有5张照片,您将得到50行,包括照片,因此实际上没有太大的性能差异。这不是迁移问题。您正在尝试访问Picture类,但此时尚未定义它(在代码后面定义)。只需将类名作为字符串传递,Django将完成其余的工作。@James Lin我不想打赌。是的,你可以用少量的项目分页,但是有一天有人决定为什么只有10个项目,改为50个。。。服务中断了。这绝对不是一个好的做法。我严重怀疑拥有250条记录是否会导致服务中断,除非您在raspberry pi上运行此功能,在房屋模型中使用
default\u picture
,而不是照片取决于房屋,现在房屋需要了解照片模型,这也意味着默认的_photo字段必须为空,另外,一栋房子现在可以拥有另一组房子照片中的默认照片。