Django的多对多添加

问题描述 投票:0回答:2

我有2种型号在我的项目有多对多的关系。在节能模式下,我从event_attendees文件中读取,并在事件添加到与会者现场。显示没有错误/异常,但与会者不会添加到与会者现场。我需要与参会者现场更改后再次保存模型?如果是这样,怎么做(调用保存从add_attendees方法将导致程序进入无限循环)?

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
django django-models manytomanyfield
2个回答
1
投票

这是你已经没救了与会者的对象。

您可以通过使用在M2M领域的create法快捷键吧:

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

(请注意,请不要盲目赶例外。Django会已经做到这一点,报告有用的错误页面,只有抓住你实际上是在要处理的异常。)


0
投票

显然,当我使用非管理员网络信息中心的功能工作。虽然通过默认创建/管理仪表板使用,此功能不能正常工作。我从结果假设管理员端代码调用不同的方法,同时节省(应该叫,因此我保存方法与其他方法一起),即使我已经覆盖了保存方法的模型对象。如果我找到它,我将与更多的信息更新。

© www.soinside.com 2019 - 2024. All rights reserved.