繁体   English   中英

Django ::参考外键

[英]Django :: Reference foreign key

我想创建一个页面,在其中可以按网页上的图片显示属性。

当前,“我的财产”模型如下所示(已删除一些代码):

class Property(models.Model):
    PROPERTY_TYPE = (('Room', 'Room'), ('House', 'House'))
    type = models.CharField(max_length=100, choices=PROPERTY_TYPE)
    title = models.CharField(max_length=100, db_index=True)
    beds = models.IntegerField(null=True, blank=True)
    price = models.IntegerField()
    payment_term = models.CharField(choices=PAYMENT_TERM_CHOICES, max_length=50)

和图片模型

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]

通过传递的room_list列表运行for循环时,我想像引用它一样

房间的图片第一张清单

我尝试遍历Django的一对多关系官方文档,但似乎无法遵循。

我将如何实现这一目标?

尽管您可以使用以下方式:

{% for room in room_list %}
   <img src="{{ room.picture_set.first }}"/>
{% endfor %}

我不推荐。 原因是,对于每个room_list项目,您都进入了Picture项目的数据库。 因此,例如,当您有30个项目时,将轰炸31个查询的数据库。

您可以做的最简单的事情就是为您添加另一个字段,例如default_picture,这将是FK,默认为None。 保存图片后,填写该图片的ID(业务逻辑上使用的图片以及如何在没有图片的情况下处理记录)。 然后,您可以通过以下方式获取记录:

room_list = Property.objects.filter(
    type='Room'
).select_related(
    'default_picture'
).order_by('timestamp')[6]

这将导致一个查询。 当然,还有另一种方法可以实现相同目的,但是这些方法更加复杂。

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

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

room_list = Property.objects.filter(
    type='Room'
).prefetch_related(
    'picture_set'
)

这将转换为两个查询,一个查询用于“属性”列表,第二个查询用于与拉出的“ Property”项相关的所有Picture记录(Django将以编程方式将其连接)。 对于程序员来说,这是个懒惰,但是请考虑您正在按属性加载所有图片记录。 但这肯定是比picture_set更好的解决方案,并且比我的第一个建议更容易实现(这并不意味着有更好的解决方案)。

room_list.picture_set.all()是访问图片集的方式。 要获得第一个,只需访问room_list.picture_set.first() 模板版本: {{ room_list.picture_set.first }}

相关的Django文档

.first文档

只需在这里回答您的问题:

{% for room in room_list %}
   <img src="{{ room.picture_set.first }}"/>
{% endfor %}

然后有一整对其进行优化。

BTW:

这个查询只会给你第七宫

room_list = Property.objects.all().filter(type='Room').order_by('timestamp')[6]

你可能想要[:6]

你也不必调用.all()之前.filter()

room_list = Property.objects.filter(type='Room').order_by('timestamp')[:6]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM