Джанго / Python / ORM нуб здесь!Я с трудом нахожу мысли о том, как работают объединения в ORM.
Вот мои модели:
class Courts(models.Model):
id = models.AutoField(primary_key=True)
location_name = models.CharField(max_length=100)
number = models.IntegerField()
def __unicode__(self):
return "%s %s %s" % (self.id, self.location_name, self.number)
class Matches(models.Model):
id = models.AutoField(primary_key=True)
date = models.DateTimeField()
court = models.ForeignKey(Courts)
def __unicode__(self):
return "%s %s" % (self.id, self.date)
class Participants(models.Model):
id = models.AutoField(primary_key=True)
match = models.ForeignKey(Matches)
userid = models.ForeignKey(User)
games_won = models.IntegerField()
def __unicode__(self):
return "%s %s %s" % (self.id, self.games_won, self.userid)
Первый шаг - это получить все «участия».в вывод, подобный следующему:
[match_id] [date] [userid] [games_won] [court_location_name] [court_number]
1 01-01-2011 mike 6 Queen 5
1 01-01-2011 chris 4 Queen 5
2 01-02-2011 bob 3 Queen 6
2 01-02-2011 joe 4 Queen 6
3 01-03-2011 jessie 5 Queen 2
3 01-03-2011 john 5 Queen 2
Какой сценарий ORM я бы написал, чтобы получить это?Мне трудно понять, как работает простое объединение с ORM, а тем более объединение трех таблиц.
Далее я хочу объединить данные, чтобы они в конечном итоге выглядели так:
[match_id] [date] [player1] [player2] [p1wins] [p2wins] [game_winner] [court_location_name] [court_number]
1 01-01-2011 mike chris 6 4 mike Queen 5
2 01-02-2011 bob joe 3 4 joe Queen 6
3 01-03-2011 jessie john 5 5 draw Queen 2
Изменит ли это сценарий ORM (в представлении), который я написал бы?Это то, что мне нужно включить в представление или в шаблон?
ОБНОВЛЕНИЕ:
Итак, я думаю, я могу использовать select_related () .Итак, я попробовал Players.objects.select_related () и получаю этот оператор SQL
SELECT "squash_participants"."id", "squash_participants"."match_id", "squash_participants"."userid_id", "squash_participants"."games_won", "squash_matches"."id", "squash_matches"."date", "squash_matches"."court_id", "squash_courts"."id", "squash_courts"."location_name", "squash_courts"."number", "auth_user"."id", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."password", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."is_superuser", "auth_user"."last_login", "auth_user"."date_joined" FROM "squash_participants" INNER JOIN "squash_matches" ON ("squash_participants"."match_id" = "squash_matches"."id") INNER JOIN "squash_courts" ON ("squash_matches"."court_id" = "squash_courts"."id") INNER JOIN "auth_user" ON ("squash_participants"."userid_id" = "auth_user"."id"
Это больше похоже на то, чего я пытаюсь достичь.Теперь я не могу понять, как получить из этого данные в шаблон.
UPDATE2:
Мой взгляд выглядит так:
def index(request):
matches_list = Participants.objects.all()
return render_to_response('squash/base_matches.html', {'matches_list': matches_list}, context_instance =
RequestContext(request))
return HttpResponse(output)
И мойшаблон выглядит следующим образом:
{% for matches in matches_list %}
<tr>
<td>{{ matches.id }}</td>
<td>{{ matches.date|date:"d-m-Y" }}</td>
<td>{{ matches.date|date:"G:i" }}</td>
</tr>
{% endfor %}
Он правильно отображает все Participants.id
s, но, к примеру, не будет содержать идентификаторы матчей, даты или суды.