1

ユーザーがプレイヤーを購入できるプラットフォームを構築しています (ファンタジーリーグのように)。だから私はそのような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 以上が含まれますPlayersFantasyPlayersとはどちらもFantasyTeamsユーザーが購入した選手とチームです (0 から 5 人の選手と 0 から 1 のチームを購入できますが、それらの数は変更される可能性があります)。LUTION 私が行った現在の方法は、機能していてもかなり醜いです。私は今、リストを含むplayer#フィールドを置き換えるような、よりきちんとしたものを探しています(これはまったく一般的であるとは思わないため) 。また、2 つのモデルと を、プレーヤーのリスト (最大 5)、チームのリスト (最大 1)、およびそのユーザーのリストを含む 1 つにマージしたいと考えています。playersForeignKeyFantasyPlayersFantasyTeamsForeignKey

同様の質問を見ると、1対多のフィールドが何度か言及されていることがわかりましたが、OneToOneFieldと でさらに混乱するだけでしたManyToManyField

ForeignKeyDjangoモデルにリストを保存するように指示してもらえますか?


解決

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 以上が含まれますPlayersFantasyPlayersとはどちらもFantasyTeamsユーザーが購入した選手とチームです (0 から 5 人の選手と 0 から 1 のチームを購入できますが、それらの数は変更される可能性があります)。LUTION 私が行った現在の方法は、機能していてもかなり醜いです。私は今、リストを含むplayer#フィールドを置き換えるような、よりきちんとしたものを探しています(これはまったく一般的であるとは思わないため) 。また、2 つのモデルと を、プレーヤーのリスト (最大 5)、チームのリスト (最大 1)、およびそのユーザーのリストを含む 1 つにマージしたいと考えています。playersForeignKeyFantasyPlayersFantasyTeamsForeignKey

同様の質問を見ると、1対多のフィールドが何度か言及されていることがわかりましたが、OneToOneFieldと でさらに混乱するだけでしたManyToManyField

ForeignKeyDjangoモデルにリストを保存するように指示してもらえますか?


解決

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(...)
4

2 に答える 2

2

使用する必要がありますManyToManyField

players = models.ManyToManyField(Player, ...)

ただし、これは、Playerインスタンスが複数のFantasyPlayersインスタンスに属することができる場合にのみ問題ありません ( についても同じですTeam)。Playerインスタンスが 1 つのインスタンスにのみ属することができる場合FantasyPlayersは、関係を逆にしてモデルにForeignKeyフィールドを配置し、 を使用してリストにアクセスできます。インスタンスからのインスタンスの。FantasyPlayersPlayerrelated_fieldPlayerFantasyPlayers

于 2013-04-16T17:27:34.540 に答える
1

このソリューションはどうですか?(これがManyToManyField最良の選択肢かどうかはわかりません。)

class FantasyPlayer(models.Model):
    user = models.ForeignKey(User, unique=True)
    player = models.ForeignKey(Player)
    position = models.MultiSelectField(choices=POSITION_CHOICES, max_length=10)

# To get a list of players
user_fantasy_players = user.fantasyplayer_set.all()

欠点の1つは、編集時に一致する位置でlimit_choices_toのみ選択できるようにできないことです(例のように)が、これは別の方法で解決できます。よりエレガントで健全なデータ アーキテクチャを持つことは、長期的にはより重要です (IMO)。PlayerFantasyPlayer

于 2013-04-16T19:41:14.590 に答える