Django Manytomany添加

时间:2019-02-10 11:41:29

标签: django django-models manytomanyfield

我的项目中有2个具有多对多关系的模型。在保存模型事件时,我从event_attendees文件中读取并将其添加到事件中的与会者字段中。没有显示错误/异常,但与会者未添加到与会者字段。更改了与会者字段后,是否需要再次保存模型?如果是这样,该怎么做(从add_attendees调用save方法将导致程序陷入无限循环)?

class Attendee(models.Model):
    name = models.CharField(max_length=100)

class Event(models.Model):
    name = models.CharField(max_length=100)
    event_attendees = models.FileField(upload_to='documents/', blank=True)
    attendees = models.ManyToManyField(Attendee, blank=True)

    def save(self, *args, **kwargs):
        super().save()
        self.add_attendees()           

    def add_attendees(self):
        with open(self.event_attendees.url[1:]) as csv_file:
            # Some code here
            for row in csv_reader:
                        # Some code here
                        attendee = Attendee(name=name)
                        attendee.save()
                        self.attendees.add(attendee)
                        print(self.attendees.all())     # attendee added
                        print(attendee.event_attended)  # event present with attendee
                        #Refresh template to check changes -> Changes lost

2 个答案:

答案 0 :(得分:1)

这是您尚未保存的Attendee对象。

您可以使用m2m字段上的create方法将其快捷方式:

for row in csv_reader:
    self.attendees.create(name=whatever)

(请注意,请不要盲目捕获异常。Django已经做到了,并报告了一个有用的错误页面。仅捕获您实际要处理的异常。)

答案 1 :(得分:0)

显然,当我使用非管理员Web仪表板时,该功能有效。使用默认创建的/ admin仪表板时,此功能不起作用。我从结果中假设,即使我已覆盖save方法(因此应调用我的save方法以及其他方法),在保存模型对象的同时,管理端代码也会调用不同的方法。如果找到,我将提供更多信息。