2012-03-07 11 views
5

Questo è il modello che sto usando:Come ordinare l'albero django-mptt per DateTimeField?

class Comment(MPTTModel): 
    comment = models.CharField(max_length=1023) 
    resource = models.ForeignKey('Resource') 
    created_at = models.DateTimeField(auto_now_add=True) 
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children') 
    author = models.ForeignKey(User) 

    class MPTTMeta: 
     order_insertion_by = ['created_at'] 

Tuttavia, quando provo ad aggiungere un commento dal sito di amministrazione ottengo:

ValueError at /admin/app/comment/add/ 
Cannot use None as a query value 

sto facendo qualcosa di sbagliato con il mio modello? Mi sento come se django-mptt stia cercando di ottenere DateTimeField mentre è ancora "None", prima che sia stato impostato a livello db.

risposta

8

No, non stai facendo qualcosa di sbagliato. Questo è un bug nel django-mptt.

campi Fondamentalmente datetime con auto_add_now=True non si ottiene un valore fino a dopo django-MPTT cerca di capire dove inserire il vostro modello nella struttura.

Ho appena creato un problema su Django-MPTT per risolvere questo problema: https://github.com/django-mptt/django-mptt/issues/175

Nel frattempo, è possibile aggirare questo impostando in modo proattivo il valore da soli. Sbarazzati di auto_now_add=True e imposta il valore in un metodo save() sottoposto a override sul tuo modello ::

from datetime import datetime 

class Comment(MPTTModel): 
    comment = models.CharField(max_length=1023) 
    resource = models.ForeignKey('Resource') 
    created_at = models.DateTimeField() 
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children') 
    author = models.ForeignKey(User) 

    class MPTTMeta: 
     order_insertion_by = ['created_at'] 

    def save(self, *args, **kwargs): 
     if not self.created_at: 
      self.created_at = datetime.now() 
     super(Comment, self).save(*args, **kwargs)