2011-03-02 16 views
5

Ho un modello che ho annullato il metodo di salvataggio in modo che il metodo di salvataggio possa essere passato in alcuni dati e riempire automaticamente un campo prima di salvare. Qui è il mio modello:override Django Ottieni o crea

class AccountModel(models.Model): 

    account = models.ForeignKey(Account) 

    def save(self, request=None, *args, **kwargs): 
     if request: 
      self.account = request.session['account'] 
     super(AccountModel, self).save(*args, **kwargs) 

    class Meta: 
     abstract = True 

L'idea è ho creato un modello di base per gli oggetti che devono essere associati a un account e quindi non voglio avere a che fare con le connessioni di conto ogni volta che sono venuti fuori (che è molto). Ma mi piacerebbe anche usare get_or_create, che salva i nuovi oggetti senza passare la richiesta. So che è fattibile non usare get_or_create e fare un tentativo/tranne, ma vorrei sapere se c'è un modo per scavalcare get_or_create e quale è il modo corretto di farlo.

Ho esaminato il codice per il Manager (che sto cercando di sovrascrivere) e la funzione get_or_create chiama semplicemente una funzione get_or_create di QuerySet. Forse posso scrivere per utilizzare altre funzioni di gestione e non la versione di QuerySet di get_or_create? Cosa pensate?

risposta

4

Si potrebbe sottoclasse django.db.models.query.QuerySet e l'override del metodo get_or_create lì per accettare la tesi request parola chiave e passarlo sul save immagino, ma non è molto carina.

class AccountQuerySet(models.query.QuerySet): 
    def get_or_create(...): 
     ... 

Si potrebbe quindi aggiungere un manager personalizzato per il vostro modello Account che utilizza questo costume QuerySet:

class AccountManager(models.Manager): 
    def get_query_set(self): 
     return AccountQuerySet(self.model) 

quindi utilizzare questo manager nel tuo modello:

class Account(models.Model): 
    ... 
    objects = AccountManager() 

ma si potrebbe trovare che il metodo try-except è in ordine dopo tutto :)

+0

Questo mi ha aiutato quando avevo bisogno di sovrascrivere bulk_create(). Grazie! – Chad