django为对象创建配置文件或页面

时间:2012-10-31 21:52:50

标签: python 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. 的正确模型设置类型
  3. 如何为此撰写视图?将场地模型与配置文件模型连接并渲染模板。

1 个答案:

答案 0 :(得分:1)

是的,你正在采取正确的方法。通常当你想要一个解耦的实体,然后你想要将属性与它相关联时(例如,配置文件给用户),OneToOneField非常有用。

就连接而言,由于这些是两个独立的表,因此没有很好的方法来合并它们。但是,由于您使用related_name参数,即使模型不同,您也可以通过以下方式轻松访问其他模型的属性:

venue = Venue.objects.get(...)
venue.name             <- Venue attribute
venue.venueProfile.foo <- VenueProfile attribute

这种方法的一个缺点是涉及数据库查询。为了提高效率,您可以使用其中一种方法。然而,第一种方法更有效,因为对此,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 %}