2012-10-31 43 views
0

我有一個場地對象,並希望有一個配置文件/頁面相關的對象,其中包含具體場地的信息,如價格,運行時間等。這裏是我的場地對象django創建配置文件或頁面的對象

class Venue(model.Models): 
    name=models.CharField(max_length=100) 
    # ... 
    image=models.ImageField(upload_to=...) 

現在,我不知道在哪裏與VenueProfile模型和視圖將結合這些結合在一起這一切我能想到的旁邊走:

class VenueProfile(model.Models): 
    venue=models.OneToOneField(Venue, related_name='venueProfile') 
    # ... 
    # info i want stored about the venue 
    # ... 

可有人請幫我找出如果

  1. 這是模型建立的一個對象的權限類型資料/
  2. 我怎樣寫一個vi這是爲什麼?將場地模型與配置文件模型相關聯並渲染模板。

回答

1

是的,你正在採取正確的做法。通常,當你想擁有一個分離的實體,然後如果你想關聯一些屬性(例如配置文件給用戶),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 %} 
+0

好的,謝謝你,這是非常有益的。所以我運行了一個for循環來顯示所有venue_profile.venue對象。現在,我想在{{venue.name}}上添加一個{%url個人資料%},以便指向場地個人資料模板。我會如何編寫視圖我已經嘗試了很多東西,但沒有任何工作。謝謝 –

+0

參考更新的答案 – miki725

+0

嗨即時對不起,但這是我得到的錯誤時,我做到了。找不到'(')'和'關鍵字參數'{'venue_id':''}'的場地。 –