Django Models - condicionalmente adicionando um objeto a um ManyToManyField antes de salvar

votos
1

O seguinte não funciona muito bem, o seu objectivo é:

Após a salvar, verificar a existência de 'supervisor' nos 'operadores', e adicioná-lo também eles, se não.

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)

Obrigado por seus conhecimentos, seria 'expert'!

Publicado 11/03/2009 em 00:53
fonte usuário
Em outras línguas...                            


3 respostas

votos
2

Você pode fazer algo como isto para verificar se o supervisor está nos operadores:

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

E você não precisa salvar uma segunda vez depois de modificar a muitos para muitos campo. (Muitos para muitos relações são armazenadas em sua própria mesa.)

Respondeu 11/03/2009 em 04:27
fonte usuário

votos
1

Ok, eu já modificou a fazer o seguinte. Na verdade, quer condicional parece fazer o truque. A questão agora é que o método add () não está funcionando para mim.

#...

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?
Respondeu 11/03/2009 em 04:55
fonte usuário

votos
0

Eu tenho o mesmo problema. se você estiver usando um formulário Django, fazer o seu check após o formulário é salvo e, em seguida, adicione a muitos para muitos lá. que era a única maneira que eu poderia começar em torno dele.

Respondeu 26/05/2009 em 16:05
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more