はい、あなたは正しいアプローチを取っています。通常、分離されたエンティティが必要な場合、後で属性をそれに関連付ける場合(たとえば、ユーザーへのプロファイル)OneToOneField
は、非常に便利です。
接続する限り、これらは2つの別個のテーブルであるため、これらをマージするための実際に良い方法はありません。ただし、related_name
パラメータを使用しているため、モデルが異なっていても、次の方法で他のモデルの属性に簡単にアクセスできます。
venue = Venue.objects.get(...)
venue.name <- Venue attribute
venue.venueProfile.foo <- VenueProfile attribute
このアプローチの欠点の1つは、データベースクエリが関係していることです。これをより効率的にするために、これらのアプローチのいずれかを実行できます。ただし、最初のアプローチはより効率的です。そのため、Djangoは「Python」結合よりも高速なSQL結合を使用するためです。
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 %}