是的,你正在採取正確的做法。通常,當你想擁有一個分離的實體,然後如果你想關聯一些屬性(例如配置文件給用戶),OneToOneField
是非常有用的。
就連接而言,由於這些是兩個獨立的表格,所以沒有合併這些表格的真正好方法。但是,由於您使用的related_name
參數,儘管車型不同,你可以很容易地訪問其他模型的屬性:
venue = Venue.objects.get(...)
venue.name <- Venue attribute
venue.venueProfile.foo <- VenueProfile attribute
一脈相承這種方法的一面是,有涉及到數據庫查詢。爲了提高效率,您可以採取其中一種方法。然而,第一種方法更高效,因爲爲此,Django將使用SQL連接,對於「Python」連接更快。
profile = VenueProfile.objects.filter(...).select_related('venue')[0]
venue = profile.venue <- no extra query
或這種方法在這裏Django會做在Python的加入讓慢:
venue = Venue.objects.filter(...).prefetch_related('venueProfile')[0]
在這一點上,這些都只是普通的對象,所以你可以很容易地將它們傳遞到模板。下面是一個簡單的觀點,urlconfig和模板例如:
def all_venues(request):
# note that querying profiles...
venues = VenueProfile.objects.all().select_related('venue')
return render_to_response('template.html', {'venues':venues})
def venue(request, venue_id):
venue = VenueProfile.objects.filter(venue__pk=venue_id).select_related('venue')
if len(venue) == 1:
venue = venue[0]
else:
raise Http404
...
urlconfig:
url(r'^venue/all/$', 'all_venues', name='all_venues'),
url(r'^venue/(?P<venue_id>\d+)/$', 'venue', name='venue'),
和模板
{% load url from future %}
{% for venue_profile in venues %}
{% with venue=venue_profile.venue profile=venue_profile %}
<ul>
<li>
<a href="{% url 'venue' venue_id=venue.pk %}">
{{ venue.name }}</a><br>
<img href="{{ venue.image.url }}"><br>
{{ profile.foo }}
</li>
</ul>
{% endwith %}
{% empty %}
No venues
{% endfor %}
好的,謝謝你,這是非常有益的。所以我運行了一個for循環來顯示所有venue_profile.venue對象。現在,我想在{{venue.name}}上添加一個{%url個人資料%},以便指向場地個人資料模板。我會如何編寫視圖我已經嘗試了很多東西,但沒有任何工作。謝謝 –
參考更新的答案 – miki725
嗨即時對不起,但這是我得到的錯誤時,我做到了。找不到'(')'和'關鍵字參數'{'venue_id':''}'的場地。 –