Django ManyToManyField не сохраняет отношения m2m - PullRequest
0 голосов
/ 31 августа 2018

У меня есть модель, определенная так:

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 имеет метод, который возвращает своих игроков, поэтому я переопределил метод сохранения модели голосования:

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 (а таблица voice_voters остается пустой в БД).

Очевидное устранение неполадок: набор запросов определенно не пустой, определенно вызывается метод сохранения.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Оказывается, это была проблема с разделом администратора. Использование точного метода сохранения, показанного в вопросе, отлично работало при отправке через форму. @ Ссылка Сельчука на этот ответ этот ответ решил проблему

0 голосов
/ 31 августа 2018

Ваши 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)

в форм.пи

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

...