ユーザーがプレイヤーを購入できるプラットフォームを構築しています (ファンタジーリーグのように)。だから私はそのような4つのモデルを持っています:
POSITION_CHOICES = ((1,'1'),
(2,'2'),
(3,'3'),
(4,'4'),
(5,'5'),
)
class Team(models.Model):
...
class Player(models.Model):
team = models.ForeignKey(Team, blank=True, null=True, ...)
position = MultiSelectField(
user = models.ForeignKey(User, unique=True)
player1 = models.ForeignKey(Player, related_name='+', blank=True,null=True,
limit_choices_to={'position__icontains':1},...)
player2 = ...
player3 = ...
player4 = ...
player5 = ...
...
class FantasyTeams(models.Model):
user = models.ForeignKey(User, unique=True)
team1 = models.ForeignKey(Team, verbose_name='Team', blank=True, null=True,
on_delete=models.SET_NULL)
...
基本的に aTeam
には 0 以上が含まれますPlayers
。FantasyPlayers
とはどちらもFantasyTeams
ユーザーが購入した選手とチームです (0 から 5 人の選手と 0 から 1 のチームを購入できますが、それらの数は変更される可能性があります)。LUTION 私が行った現在の方法は、機能していてもかなり醜いです。私は今、リストを含むplayer#
フィールドを置き換えるような、よりきちんとしたものを探しています(これはまったく一般的であるとは思わないため) 。また、2 つのモデルと を、プレーヤーのリスト (最大 5)、チームのリスト (最大 1)、およびそのユーザーのリストを含む 1 つにマージしたいと考えています。players
ForeignKey
FantasyPlayers
FantasyTeams
ForeignKey
同様の質問を見ると、1対多のフィールドが何度か言及されていることがわかりましたが、OneToOneField
と でさらに混乱するだけでしたManyToManyField
。
ForeignKey
Djangoモデルにリストを保存するように指示してもらえますか?
解決
FantasyPlayers
以下は、前のandを置き換えていFantasyTeams
ます。
class FantasyTeam(models.Model):
user = models.ForeignKey(User, unique=True)
players = models.ManyToManyField(Player, blank=True, null=True)
teams = models.ManyToManyField(Team, blank=True, null=True)
...
これは、モデルを作成して保存する方法です(を介してModelForm
):
def fantasy_create(request):
# Handling form datas
if request.method == "POST":
form = EditFantasyTeamForm(request.POST)
if form.is_valid():
fantasy = FantasyTeam.objects.create(user=request.user)
for player in form.cleaned_data['players']:
fantasy.players.add(player)
for team in form.cleaned_data['teams']:
fantasy.teams.add(team)
return redirect(...)
# Form is not submitted yet
else:
form = EditFantasyTeamForm()
return render_to_response(...)
def fantasy_edit(request):
# Fetching the FantasyTeam object
fantasy = ...
# Handling form datas
if request.method == "POST":
form = EditFantasyTeamForm(request.POST, instance=fantasy)
if form.isLUTION_valid():
form.save()
return redirect(...)
# Form not submitted yet
else:
form = EditFantasyTeamForm(instance=fantasy)
return render_to_response(...)choices=POSITION_CHOICES, max_length=10)
...
class FantasyPlayers(models.Model):
user = models.ForeignKey(User, unique=True)
player1 = models.ForeignKey(Player, related_name='+', blank=True,null=True,
limit_choices_to={'position__icontains':1},...)
player2 = ...
player3 = ...
player4 = ...
player5 = ...
...
class FantasyTeams(models.Model):
user = models.ForeignKey(User, unique=True)
team1 = models.ForeignKey(Team, verbose_name='Team', blank=True, null=True,
on_delete=models.SET_NULL)
...
基本的に aTeam
には 0 以上が含まれますPlayers
。FantasyPlayers
とはどちらもFantasyTeams
ユーザーが購入した選手とチームです (0 から 5 人の選手と 0 から 1 のチームを購入できますが、それらの数は変更される可能性があります)。LUTION 私が行った現在の方法は、機能していてもかなり醜いです。私は今、リストを含むplayer#
フィールドを置き換えるような、よりきちんとしたものを探しています(これはまったく一般的であるとは思わないため) 。また、2 つのモデルと を、プレーヤーのリスト (最大 5)、チームのリスト (最大 1)、およびそのユーザーのリストを含む 1 つにマージしたいと考えています。players
ForeignKey
FantasyPlayers
FantasyTeams
ForeignKey
同様の質問を見ると、1対多のフィールドが何度か言及されていることがわかりましたが、OneToOneField
と でさらに混乱するだけでしたManyToManyField
。
ForeignKey
Djangoモデルにリストを保存するように指示してもらえますか?
解決
FantasyPlayers
以下は、前のandを置き換えていFantasyTeams
ます。
class FantasyTeam(models.Model):
user = models.ForeignKey(User, unique=True)
players = models.ManyToManyField(Player, blank=True, null=True)
teams = models.ManyToManyField(Team, blank=True, null=True)
...
これは、モデルを作成して保存する方法です(を介してModelForm
):
def fantasy_create(request):
# Handling form datas
if request.method == "POST":
form = EditFantasyTeamForm(request.POST)
if form.is_valid():
fantasy = FantasyTeam.objects.create(user=request.user)
for player in form.cleaned_data['players']:
fantasy.players.add(player)
for team in form.cleaned_data['teams']:
fantasy.teams.add(team)
return redirect(...)
# Form is not submitted yet
else:
form = EditFantasyTeamForm()
return render_to_response(...)
def fantasy_edit(request):
# Fetching the FantasyTeam object
fantasy = ...
# Handling form datas
if request.method == "POST":
form = EditFantasyTeamForm(request.POST, instance=fantasy)
if form.isLUTION_valid():
form.save()
return redirect(...)
# Form not submitted yet
else:
form = EditFantasyTeamForm(instance=fantasy)
return render_to_response(...)