2014-10-16 3 views
0

Я хочу обновить одно логическое поле всех объектов в таблице электронной почты, но мне нужно сделать это, когда одно письмо будет сохранено. У меня есть объект с именем Vendor и другим именем клиента, и может иметь несколько E-mail-х, (Email/Клиент имеет OneToMany Отношения к письмам,) это мой Email модель:DJANGO Обновление поля всех объектов в таблице при сохранении

class Email(models.Model): 
    main = models.BooleanField("(Main)", default=False) 
    address = models.CharField("Email address") 

    limit = models.Q(app_label='store', model='store') | models.Q(app_label='core', model='client') 
    content_type = models.ForeignKey(ContentType, 
            limit_choices_to=limit, 
            verbose_name="Related Object Type") 
    object_id = models.PositiveIntegerField(verbose_name="Related Object ID") 
    content_object = GenericForeignKey('content_type', 'object_id') 

    class Meta: 
     app_label = 'info' 

Как вы можете видеть по электронной почте имеет genericforeignkey, потому что они могут принадлежать модели поставщика или клиента, основное поле означает, что это письмо является основным связанным объектом, только 1 электронное письмо каждого связанного объекта может иметь main = True.

Мой подход был переопределить метод сохранения:

def save(self, *args, **kwargs): 

    emails = Email.objects.filter(content_type__pk=self.content_type.id, object_id=self.object_id, main=True) 
    for email in emails: 
     email.main = False 
     email.save() 
    self.main = True 
    super(Email, self).save(*args, **kwargs) 

Проблема заключается в том: Когда я пытаюсь сохранить по электронной почте я запрос для всех сообщений электронной почты, чтобы установить основное поле ложь, но мне нужно, чтобы сохранить объект изменен, он снова вызывает функцию сохранения, дающую мне ошибку.

Есть ли способ сделать это без бесконечного цикла?

ответ

1

Как насчет вызова update, который просто обновляет поля и не вызывает save.

def save(self, *args, **kwargs): 

    Email.objects.filter(content_type__pk=self.content_type.id, object_id=self.object_id, main=True).update(main=False) 

    self.main = True 
    super(Email, self).save(*args, **kwargs) 

Вот documentation on update

+0

Nice, работал отлично! спасибо –

Смежные вопросы