Джанго Манитоманы добавить - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть 2 модели в моем проекте с отношением ко многим.При сохранении модели Event я читаю из файла event_attendees и добавляю его в поле участника в Event.Ошибки / исключения не отображаются, но участник не добавляется в поле участников.Нужно ли снова сохранять модель после изменения в поле участников?Если это так, как это сделать (вызов метода save из 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

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Видимо, эта функция работала, когда я пользовался неадминной веб-панелью.При использовании панели управления по умолчанию созданной / admin эта функция не работала.Исходя из результатов, я предполагаю, что код на стороне администратора вызывает различные методы при сохранении объекта модели, даже если я переопределил метод сохранения (и, следовательно, должен быть вызван мой метод сохранения вместе с другими методами).Я буду обновлять с дополнительной информацией, если я найду это.

0 голосов
/ 10 февраля 2019

Это объект Attendee, который вы не сохранили.

Вы можете сократить его, используя метод create в поле m2m:

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

(Обратите внимание, пожалуйста, не слепо ловите исключения. Django уже сделает это и сообщитполезная страница ошибок. Поймайте только те исключения, с которыми вы действительно собираетесь иметь дело.)

...