Django ManyToManyField没有保存M2M关系

时间:2018-08-30 23:45:42

标签: python django django-models

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

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表仍然为空)。

明显的故障排除:queryset绝对不是空的,肯定会调用save方法。

2 个答案:

答案 0 :(得分:1)

您的模型。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方法

答案 1 :(得分:1)

事实证明这是管理员部分的问题。通过表格提交时,使用问题中显示的精确保存方法可以完美地工作。 @Selcuk指向此答案this answer的链接解决了问题