我有一个场地对象,并希望有一个与该对象相关联的个人资料/页面,其中包含特定于场地的信息,如价格,营业时间等。这是我的场地对象
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
# ...
有人可以帮我弄清楚是否
答案 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 %}