TypeError: Прямое присвоение прямой стороне множества "многие ко многим" запрещено. Вместо этого используйте meeting.set(). Ошибка с полями Django m2m
Я новичок в Django и я застрял на отношениях многие-ко-многим. Здесь я получаю данные google meet из моего google calendar через calendar API. Я успешно получил данные, но когда я сохраняю участников встречи... появляется эта ошибка
TypeError: Direct assignment to the forward side of a many-to-many set is prohibited. Use meeting.set() instead.
вот код, в котором существует проблема
create a partcipant object & save it
for email in participants_emails:
participant_obj,created = Participant.objects.create(
meeting=meeting_obj, email=participants_emails)
print(f'participant {participant_obj} was created==== ',created)
В приведенном выше коде у меня есть доступ ко всем электронным адресам участников в participants_emails
.
и я должен был сохранить их в модели.
Ниже приводится
models.py
from django.db import models
from django.contrib.auth.models import User
class Meeting(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
unique_key = models.CharField(max_length=100, unique=True)
subject = models.CharField(max_length=400, null=True, blank=True)
start_at = models.DateTimeField(
auto_now_add=False, auto_now=False, null=True)
end_at = models.DateTimeField(
auto_now_add=False, auto_now=False, null=True)
feedback_status = models.BooleanField(null=True, default=False)
def __str__(self):
return self.subject
class Participant(models.Model):
meeting = models.ManyToManyField(to=Meeting)
email = models.EmailField(default=None, blank=True, null=True)
def __str__(self):
return self.email
class Question(models.Model):
question_type = [
('checkbox', 'CheckBox'),
('intvalue', 'Integar Value'),
('text', 'Text'),
('radio', 'Radio Button'),
]
question_label = models.TextField(null=True, blank=True)
question_type = models.CharField(
choices=question_type, default='text', max_length=80)
def __str__(self):
return self.question_label
class UserFeedback(models.Model):
meeting = models.ForeignKey(Meeting, on_delete=models.CASCADE)
participant = models.ForeignKey(Participant, on_delete=models.CASCADE)
question = models.OneToOneField(Question, on_delete=models.CASCADE)
question_answer = models.CharField(max_length=300, null=True, blank=True)
def __str__(self):
return str(self.meeting)
Вы не можете использовать meeting=meeting_obj
, так как это ManyToManyField
, а чтобы добавить что-то к ManyToManyField
, сначала оба объекта должны иметь первичный ключ.
Впоследствии вы можете добавить его к ManyToManyField
, например, с помощью:
for email in participants_emails:
participant_obj, created = Participant.objects.get_or_create(email=participants_emails)
participant_obj.meeting.add(meeting_obj)
print(f'participant {participant_obj} was created==== ',created)
Вероятно, вы также хотите использовать get_or_create(…)
[Django-doc], поскольку create(…)
[Django-doc] не возвращает 2-кортеж с created
.