簡體   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