[英]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 }}
。
只需在這里回答您的問題:
{% 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.