2013-12-10 21 views
5

Ho un modello django con due campi chiave esterna, uno che punta al prodotto, gli altri punti al portafoglio nel codice sotto. Esattamente uno di questi dovrebbe essere impostato per ogni record Lca. So che posso fare questo con MySQL innesca, ma mi chiedevo se ci fosse un modo per rendere questo condizionale salva in DjangoDue campi chiave estranei, esattamente uno è impostato su un valore, l'altro nullo nel modello django con database MySQL

class Lca(models.Model): 
    product    = models.ForeignKey(product, null=True, blank=True) 
    portfolio   = models.ForeignKey(portfolio, null=True, blank=True) 
    carbon_price  = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True) 
    name    = models.CharField(max_length=255, blank=True) 
    total_footprint  = models.IntegerField(blank=True, null=True) 
    calculation_type = models.CharField(max_length=9) 
    total_cv   = models.DecimalField(max_digits=10, decimal_places=0, blank=True, null=True) 
    source    = models.CharField(max_length=255, blank=True) 
    date_from   = models.DateField() 
    date_to    = models.DateField(blank=True, null=True) 

    def __unicode__(self): 
     return self.name 
    # end __unicode__ 
# end 

risposta

7

È possibile overridesave il metodo del modello:

def save(self, *args, **kwargs): 
    if self.product and self.portfolio or not self.product and not self.portfolio: 
     raise ValueError('Exactly one of [Lca.product, Lca.portfolio] must be set') 

    super(Lca, self).save(*args, **kwargs) 

Si noti che questo metodo non è applicabile a bulk_create.

+0

Grazie. Questo sta funzionando – MagicLAMP

0

Si consiglia di aggiungere un metodo modello clean() per qualsiasi convalida personalizzata che si desidera aggiungere. I metodi Model Clean vengono chiamati automaticamente da ModelForms, ma non da save(), quindi potrebbe essere necessario chiamare il metodo full_clean() e gestire ValidationErrors se si verificano, a seconda del caso d'uso.

Vedere Django documentation per ulteriori informazioni su Model.clean().