2014-11-21 17 views
24

Ho un metodo has_related_object nel mio modello che ha bisogno di controllare se un oggetto correlato esistecontrollare Django se un oggetto correlato esiste errore: RelatedObjectDoesNotExist

class Business(base): 
     name = models.CharField(max_length=100, blank=True, null=True) 

    def has_related_object(self): 
     return (self.customers is not None) and (self.car is not None) 


class Customer(base): 
     name = models.CharField(max_length=100, blank=True, null=True) 
     person = models.OneToOneField('Business', related_name="customer") 

ma ho l'errore:

Business.has_related_object()

RelatedObjectDoesNotExist: Business has no customer.

risposta

32

Modifica: La risposta di questo articolo è migliore.

Questo perché l'ORM deve andare nel database per verificare se esiste customer. Dal momento che non esiste, solleva un'eccezione.

Dovrete cambiare il metodo al seguente:

def has_related_object(self): 
    has_customer = False 
    try: 
     has_customer = (self.customers is not None) 
    except Customer.DoesNotExist: 
     pass 
    return has_customer and (self.car is not None) 

non so la situazione con self.car quindi lascio a voi per regolarlo, se ne ha bisogno.

Nota a margine: Se si esegue questa operazione su un modello con ForeignKeyField o OneToOneField su di esso, è possibile eseguire quanto segue come collegamento per evitare la query del database.

def has_business(self): 
    return self.business_id is not None 
+1

nota che, secondo il documento (https://docs.djangoproject.com/en/1.9/ref/models/fields/ # database-representation), "[...] il tuo codice non dovrebbe mai avere a che fare con il nome della colonna del database, a meno che tu non scriva SQL personalizzato. Tratterai sempre con i nomi dei campi del tuo oggetto modello.". –

+0

Questo è un approccio più veloce dell'altra risposta, poiché non richiede la comunicazione con il database. – Dan

58

Usa hasattr(self, 'customers') per evitare il controllo di eccezione come recommended in Django docs:

def has_related_object(self): 
    return hasattr(self, 'customers') and self.car is not None 
+3

Dovrebbe essere accettata risposta. –

+0

concordato con @iYalovoi – potatoes

Problemi correlati