Django Models - Условное добавление объекта в ManyToManyField перед сохранением - PullRequest
1 голос
/ 11 марта 2009

Следующее не совсем работает, его цель:

При сохранении проверьте наличие «супервизора» в «операторах» и добавьте его, если нет.

class JobRecord(models.Model):
    """JobRecord model"""

    project             = models.ForeignKey(Project)
    date                = models.DateField()
    supervisor          = models.ForeignKey(User, related_name='supervisor_set')

    operators           = models.ManyToManyField(User, related_name='operators_set', help_text='Include the supervisor here also.')

    vehicles            = models.ManyToManyField(Vehicle, blank=True, null=True)

    def __unicode__(self):
        return u"%s - %s" % (self.project.name,  self.date.strftime('%b %d'))

    # --- over ride methods ---- #

    def save(self, **kwargs):
        # this must be done to get a pk
        super(JobRecord, self).save(**kwargs)

        # which makes this comparison possible
        if self.supervisor not in self.operators.__dict__:
            self.operators.add(self.supervisor)

        # it seems to get this far ok, but alas, the second save attempt
        # does not seem to work!
        print self.operators.values()
        super(JobRecord, self).save(**kwargs)

Спасибо за ваш опыт, буду «экспертом»!

Ответы [ 3 ]

2 голосов
/ 11 марта 2009

Вы можете сделать что-то вроде этого, чтобы проверить, есть ли супервизор в операторах:

if self.operators.filter(id=self.supervisor.id).count() == 0:

И вам не нужно сохранять второй раз после изменения поля многие ко многим. (Многие ко многим отношениям хранятся в их собственной таблице.)

1 голос
/ 11 марта 2009

Хорошо, я изменил, чтобы сделать следующее. На самом деле, любое из условных решений, похоже, помогает. Проблема в том, что метод add () у меня не работает.

#...

def save(self, **kwargs):
    super(JobRecord, self).save(**kwargs)

    if self.operators.filter(id=self.supervisor.id).count() == 0:
    #if self.supervisor not in self.operators.values():

        # either conditional will get to this point
        self.operators.add(self.supervisor) # <-- this line doesn't save proper?
0 голосов
/ 26 мая 2009

У меня та же проблема. Если вы используете форму Django, проверьте ее после сохранения формы, а затем добавьте многие ко многим там. это был единственный способ обойти это.

...