0

会場オブジェクトがあり、価格や営業時間などの会場固有の情報を含むオブジェクトに関連付けられたプロファイル/ページのいずれかが必要です。これが私の会場オブジェクトです

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. このためのビューを作成するにはどうすればよいですか?会場モデルをプロファイルモデルに接続し、テンプレートをレンダリングします。
4

1 に答える 1

1

はい、あなたは正しいアプローチを取っています。通常、分離されたエンティティが必要な場合、後で属性をそれに関連付ける場合(たとえば、ユーザーへのプロファイル)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 %}
于 2012-10-31T22:08:50.197 に答える