我正在构建一个用户可以购买玩家的平台(比如幻想联盟)。 所以我有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)
    ...

基本上一个Team包含0个或更多Players FantasyPlayersFantasyTeams都是用户购买的玩家和团队(他可以购买0到5个玩家和0到1个团队,但这些数字可能会被更改)。 LUTION目前我做过的方式非常难看,即使它有效。 我现在正在寻找更整洁的东西(因为我发现它根本不是通用的),比如用包含ForeignKey列表的players替换player#字段。 我也愿意合并两个模型FantasyPlayersFantasyTeams ,其中包含一个玩家列表(最多5个),一个团队列表(最多1个)和ForeignKey到其用户。

我看到在查看类似问题时多次提到一对多字段 ,但它所做的只是让我对OneToOneFieldManyToManyField更加困惑。

有什么方向可以让我在Django模型中存储ForeignKey列表吗?


以下是取代之前的FantasyPlayersFantasyTeams

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

基本上一个Team包含0个或更多Players FantasyPlayersFantasyTeams都是用户购买的玩家和团队(他可以购买0到5个玩家和0到1个团队,但这些数字可能会被更改)。 LUTION目前我做过的方式非常难看,即使它有效。 我现在正在寻找更整洁的东西(因为我发现它根本不是通用的),比如用包含ForeignKey列表的players替换player#字段。 我也愿意合并两个模型FantasyPlayersFantasyTeams ,其中包含一个玩家列表(最多5个),一个团队列表(最多1个)和ForeignKey到其用户。

我看到在查看类似问题时多次提到一对多字段 ,但它所做的只是让我对OneToOneFieldManyToManyField更加困惑。

有什么方向可以让我在Django模型中存储ForeignKey列表吗?


以下是取代之前的FantasyPlayersFantasyTeams

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

===============>>#1 票数:2

您应该使用ManyToManyField

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

但是,只有当Player实例可以属于几个FantasyPlayers实例(对于Team同样的事情)时,如果一个Player实例只能属于一个FantasyPlayers实例,你应该反转关系并将一个ForeignKey字段FantasyPlayers Player模型中的FantasyPlayers然后您可以使用related_field访问列表Player从一个实例FantasyPlayers实例。

===============>>#2 票数: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()

它的一个缺点是无法使用limit_choices_to只允许在编辑FantasyPlayer时选择具有匹配位置的Player (如在您的示例中),但这可以通过另一种方式解决。 从长远来看,拥有更优雅和理智的数据架构更为重要,IMO。

  ask by Mathieu Marques translate from so

未解决问题?本站智能推荐:

1回复

如何在Django中按父模型的ForeignKey订购

您好,我有2种型号: 模型使用者 型号位置 如何通过用户模型的签入次数订购位置 ? 我尝试了这个但没有成功: Location.objects.annotate(checkin_count=Count('user')).order_by('-checkin_cou
1回复

如何在Django中命名模型的Foreignkey字段?

在Django ,我可以这样命名模型的每个字段(韩文): 但是如果是ForeignKey ,则不起作用。 为什么仅在ForeignKey上不起作用?
3回复

Django中没有ForeignKey的Span模型

我正在使用Python 2.7 / Django 1.8,有点菜鸟。 我坚持使用以下两个模型创建过滤器: 这里的要点是A通过id引用B ,但是可能会有多个具有相同id的条目,除了一个之外,其他所有条目都具有active = False 。 我想做的基本上是: 我能弄清楚的
1回复

Django:循环遍历对象列表并使用ForeignKey保存在模型中

我正在尝试使用Shamir的Secret Sharing的pycryptodome实现。 分割股份时,输出是具有以下形式的元组的列表对象: 在for循环中hexlify之后,对象更具可读性: 我有这个模型: 我想以某种方式为特定的some_other_id过滤MyM
1回复

如何在Django模型ForeignKey和OneToOneField中获取所有相关对象

我正在使用django 1.9。 我有以下Django模型: 1)我试图获取所有模型对象Projects和模型对象与模型Projects Projects.objects.all().select_related('images_projects')的图像结果是,我仅获得模型对象Pro
1回复

如何在Django模型ForeignKey中获取帖子的可变值?

我创建了两个模型,一个用于发布,另一个用于评论。 我想通过在Comments类中查询forginKey变量来获取str中的帖子标题,甚至可能吗? 我曾尝试使用Comment._meta.get_field('post_id')但它无法正常工作,并且出现此错误 我的模特: cla
1回复

从Django模型中的Django管理中获取对象的过滤列表.ForeignKey字段

我有五个模型: 现在在django管理员中,当我编辑有关编辑Team1_score的详细信息时,我只想列出第1团队中的玩家。这就是我在管理员中所做的 但是当我选择一个要添加到记分卡的球员时,它列出了我在数据库中所有球员的显示。
2回复

Django模型ForeignKey

如果我想从同一模型中的另一个类向模型添加外键 那可能吗? 编程动作有意义吗? 这个ForeignKey也是一个ID号(就像主键一样),我也想导入到其他类中。 // @ ManojGovindan: 例如 这样我也可以在该表(?)/模型中使用该数据。 谢谢
1回复

Django模型ForeignKey 2

我不知道如何“导入”(我不知道正确的术语,所以请不要在此钉我)外键从一个模型类到另一个: 例如 因此,现在我拥有class2中来自class1的variable1的所有数据。 我认为这将由ForeignKey完成。 如果我以Django官方文档为例(请参见下文),则由于
2回复

如何在Django中从一个模型到另一个模型获取ForeignKey关系的名称?

假设我们知道一个引用了另一个模型的任意模型上存在一个ForeignKey字段,我们如何找到这种关系的名称? 我正在寻找类似的东西: 这将返回u'egg' ,其中Spam看起来像这样: 这可能吗?