TypeError:禁止直接分配到多对多集合的前向端。请改用 meeting.set()。 Django m2m 字段出错
Posted
技术标签:
【中文标题】TypeError:禁止直接分配到多对多集合的前向端。请改用 meeting.set()。 Django m2m 字段出错【英文标题】:TypeError: Direct assignment to the forward side of a many-to-many set is prohibited. Use meeting.set() instead. Error with Django m2m fields 【发布时间】:2021-11-17 17:36:11 【问题描述】:我是 Django 的初学者,我被多对多的关系所困扰。在这里,我通过日历 API 从我的 Google 日历中获取 google meet 数据。我已成功获取数据,但是当我保存会议的参与者时,我收到此错误:
TypeError: 禁止直接分配到多对多集合的前端。请改用 meeting.set()。
这是有问题的代码:
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)
【问题讨论】:
【参考方案1】:你不能使用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] 不会返回带有created
的二元组。
【讨论】:
非常感谢。该解决方案开箱即用。我从 5 个小时开始就在如何做到这一点上摸不着头脑。你真是上帝派来的。以上是关于TypeError:禁止直接分配到多对多集合的前向端。请改用 meeting.set()。 Django m2m 字段出错的主要内容,如果未能解决你的问题,请参考以下文章