【问题标题】:Django ManyToManyField not saving m2m relationshipsDjango ManyToManyField 不保存 m2m 关系
【发布时间】:2018-08-30 23:45:41
【问题描述】:

我有一个这样定义的模型:

class Vote(models.Model):
    text = models.CharField(max_length=300)
    voters = models.ManyToManyField(CustomUser, blank=True)
    game = models.ForeignKey(Game, on_delete=models.CASCADE)

我希望在创建投票时将其关联游戏的所有玩家自动添加到其投票者列表中。 Game 模型有一个返回其玩家的方法,所以我重写了 Vote 模型的 save 方法:

def save(self, *args, **kwargs):
    super().save(*args, **kwargs) #As the docs state it must be saved before m2m elements can be added
    queryset = self.game.get_players
    for player in queryset:
        self.voters.add(player.id)

这不起作用。它不会抛出错误,并通过管理站点愉快地保存模型实例。但是,它似乎没有将任何玩家添加到voters 字段中(并且 db 中的 vote_voters 表仍然为空)。

明显的故障排除:查询集肯定不为空,肯定是调用了save方法。

【问题讨论】:

  • 为什么要添加player.id 而不是player
  • @Selcuk 我都试过了,都没有用
  • 你能指定你使用的是哪个版本的Django吗?
  • 啊,刚刚看到您使用的是 Django admin。见this question

标签: python django django-models


【解决方案1】:

你的models.py

class Vote(models.Model):
   text = models.CharField(max_length=300)
   voters = models.ManyToManyField(CustomUser, blank=True)
   game = models.ForeignKey(Game, on_delete=models.CASCADE)

在forms.py中

from django import forms
from your_app.models import Vote

class VoteForm(forms.ModelForm):
    class Meta:
      model = Vote
      fields = ('text', 'game')

以及基于类的创建视图

from django.views.generic.edit import CreateView
from your_app.models import Vote
from your_app.forms import VoteForm

class VoteCreate(CreateView):
   model = Vote
   form_class = VoteForm

   def form_valid(self, form):
     obj = form.save(commit=True)
     obj.voters = obj.game.get_players
     # or maybe this 
     # obj.voters.add([game.player for game in obj.game.get_players])
     obj.save()
     return super().form_valid(form)

未测试,但创建视图中的想法是您首先创建对象,然后保存 m2m。检查form_valid方法

【讨论】:

    【解决方案2】:

    原来这是管理部分的问题。通过表单提交时,使用问题中显示的确切保存方法非常有效。 @Selcuk 到这个答案的链接this answer 解决了这个问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      • 2011-12-24
      • 2014-08-16
      • 2020-06-18
      • 1970-01-01
      相关资源
      最近更新 更多