2013-01-24 9 views
6

Ho una sottoclasse model.Model che rappresenta una vista sul mio database mysql (cioè gestito = False).django previene l'eliminazione dell'istanza del modello

Tuttavia, durante l'esecuzione di mio test di unità, ottengo:

DatabaseError: (1288, 'The target table my_view_table of the DELETE is not updatable')

La fonte di questa richiesta di cancellazione è (indirettamente) tramite una chiave esterna. Ho (semplificato):

class MyViewModel(models.Model): 
    problematic_field = models.ForeignKey(ActualTableModel) # specifying on_delete=models.SET_NULL simply replaces the DELETE error with an UPDATE one 

Durante la tearDown dei miei test, sto Eliminazione dell'istanza ActualTableModel, e sembra che Django sta seguendo il comportamento documentato:

When Django deletes an object, it emulates the behavior of the SQL constraint ON DELETE CASCADE -- in other words, any objects which had foreign keys pointing at the object to be deleted will be deleted along with it.

Questa sembra essere la causa problemi quando applicato alla vista (gestita = False).

ho provato l'override del metodo di eliminazione per impedire la cancellazione:

class MyViewModel(models.Model): 
    ... 
    def delete(self, *args, **kwargs): 
     pass # deletion of a view row is never valid 

ma questo non ha risolto il problema.

Come posso evitare questo comportamento?

risposta

7

Forse potresti provare uno dei vari on_delete argument options?

Ie .:

problematic_field = models.ForeignKey(ActualTableModel, on_delete=models.PROTECT) 
+1

Grazie per il link di documentazione. Ho provato on_delete = models.SET_NULL, ma ho ignorato DO_NOTHING. Quest'ultimo risolve l'errore. – sapi