【问题标题】:Django ManyToManyField initializes with all objects by defaultDjango ManyToManyField 默认使用所有对象初始化
【发布时间】:2018-08-06 03:06:36
【问题描述】:

我有 2 个类,Player 和 Game。玩家可以拥有多个游戏,因此我们在 Player 模型中使用 m2m 关系:

class Player(models.Model):
    store_user = models.OneToOnefield(User, unique=True, on_delete=models.CASCADE)
    games = models.ManyToManyField(Game)
    isDeveloper = models.BooleanField(default=False, blank=False)

我的问题是,当新玩家注册时,出于某种原因,他们会获取所有已添加到数据库中的游戏对象。我怎样才能使新玩家最初没有游戏?

从views.py注册用户:

def signup(request):
  if request.user.is_authenticated:
      return render(request, 'home.html')
  else:
      if request.method == 'POST':
          user = UserCreateForm(request.POST)
          if user.is_valid():
              user.save()
              temp_user = User.objects.get(username=user.cleaned_data.get('username'))
              s_user = Player(store_user=temp_user, isDeveloper=user.cleaned_data.get('developer'))
              s_user.save()
              return redirect('login')
      else:
          user = UserCreateForm()
      return render(request, 'signup.html', {'form': user})

【问题讨论】:

  • 请从views.py 中添加更多代码。
  • @SadmanSobhan 我已经添加了用户注册方法。
  • 是什么让你认为玩家获得了数据库中的所有游戏?您还没有编写任何代码来实现这一点。在 admin 中,选择框仅显示所有 可用 可供选择的选项;您实际上必须选择一些(通过单击它们)才能将它们添加到播放器中。

标签: django initialization manytomanyfield m2m


【解决方案1】:

对于多对多字段,您需要使用中间表。详情请关注https://medium.com/@adriennedomingus/django-adding-an-intermediate-model-to-a-manytomany-field-without-one-493ee52ba4a5

class Player(models.Model): games = models.ManyToManyField(Game)

class GamePlayer(models.Model): players = models.ForeignKey(Player, on_delete=models.CASCADE) games = models.ForeignKey(Game, on_delete=models.CASCADE)

【讨论】:

  • 谢谢,这似乎已经解决了问题。确认后我会将其标记为答案。
  • 不,您确实不需要需要中间表。这个答案是完全错误的。
猜你喜欢
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 2012-01-02
  • 1970-01-01
  • 2013-06-27
  • 2018-01-11
相关资源
最近更新 更多