Модели форм Джанго и редактирование - PullRequest
0 голосов
/ 23 декабря 2009

Ух, у меня такие тяжелые времена. Я должен делать что-то не так, я получаю невероятное количество запросов.

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

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

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

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

Это уже начинается плохо, потому что для каждого экземпляра игрока в матче Django попадает в базу данных и получает список всех игроков. Например, если в матче участвуют 6 игроков, и у меня есть 2 пустые формы, подтвержденные 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 Ответ

3 голосов
/ 24 декабря 2009

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

Вот документы.


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

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

Правильно? Из вашего вопроса:

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

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

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

Несвязанное предложение: посмотрите на интерполяцию строки питона .

Боа сорте!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...