2009-12-23 7 views
0

Вау, мне так тяжело. I должен делать что-то неправильно, я получаю невероятное количество запросов.Модели и редактирование форм Django

Итак, мои модели являются следующие: игрока Clan Match (как в матче с игрой) MatchMap (карты играли матча) MatchPlayer (игроки матча)

Все они связаны через внешний ключ, без отношения m2m. Игрок может быть в клане, а матч - 2 клана. В матче может быть любое количество карт, и только игроки из двух вовлеченных кланов могут находиться в матче (хотя в будущем игроки могут оказаться не в том же клане, который они сыграли в этом матче, поэтому я указываю ту сторону, которую они играли на совпадение).

Итак, я сделал подачу, все в порядке. Но для редактирования этой информации это caos! Для редактирования MatchPlayers матча я попытался с помощью inlineformset_factory

PlayersFormSet = inlineformset_factory(MatchBetweenClans, MatchPlayer) 
playersForms = PlayersFormSet(instance=match) 

Это уже начинает плохо, потому что для каждого экземпляра игрока на матче, Джанго попадает в базу данных и получает список всех игроков. Если, например, 6 игроков на матч, и у меня есть 2 пустые формы provived по inlineformset_factory, я вижу на бревне

SELECT 
... 
FROM 
`accounts_customuser` 

8 раз.

Теперь, даже если это сработало правильно для меня, оно не делает то, что мне нужно. При добавлении игроков в матч не все игроки должны быть в списке, только те из 2 указанных кланов, в идеале как форма флажков (каждый флажок является игроком клана). При подаче матча это легко сделать:

clan1PlayerList = CustomUser.objects.filter(clan=clan1Instance) 
clan2PlayerList = CustomUser.objects.filter(clan=clan2Instance) 
playersClan1 = forms.ModelMultipleChoiceField(queryset=clan1PlayerList, label="Jogadores - "+clan1Instance.tag+"", widget=forms.CheckboxSelectMultiple(attrs={'class':'input_checkbox'})) 
playersClan2 = forms.ModelMultipleChoiceField(queryset=clan2PlayerList, label="Jogadores - "+clan2Instance.tag, widget=forms.CheckboxSelectMultiple(attrs={'class':'input_checkbox'})) 

Есть в любом случае я мог бы это на фармакологическом для редактирования? Я не могу найти способ отправить список игроков клана и верных игроков матча в форму. Спасибо

+1

Вопрос был бы намного легче читать, если бы вы разместили модели вместо текстового описания того, что они собой представляют. Не жалуюсь, просто мое мнение. :-) – cethegeek

ответ

3

Возможно, вы захотите посмотреть select_related.

Here are the docs.


Я должен был пойти читать ваш вопрос еще раз, поскольку вопрос ее часть не была ясна для меня. Я думал, что у вас возникла проблема с слишком большим количеством запросов, попадающих в базу данных (что тоже может быть проблемой, и выбор связанных поможет там), но ваш вопрос действительно таков:

Как фильтровать поле формы, чтобы разрешать значения на основе в другом поле?

Исправить? Из Вашего вопроса:

При добавлении игроков к матчу, не все игроки должны быть в списке, только те из 2 указанных родов, в идеале, как форма флажков (каждый флажок будучи игроком клана) ,

На ваш взгляд, фильтруйте поля в каждой форме кланом.Нечто подобное (без вашей модели я могу только догадываться имена полей):

form.fields['player'].queryset=form.fields['player'].queryset.filter(clan__in=list_of_selected_clans) 

Unrelated предложение:look at python's string interpolation.

Boa sorte!

+0

благодарю вас за ответ celopes, обязательно посмотрим на него obrigado! – Clash

Смежные вопросы