2012-03-07 22 views
5

Đây là mô hình tôi đang sử dụng:Làm thế nào để đặt hàng cây django-mptt bởi 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'] 

Tuy nhiên, khi tôi cố gắng thêm một bình luận từ các site admin tôi nhận được:

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

Tôi có làm điều gì sai với mô hình của tôi? Tôi cảm thấy như django-mptt đang cố gắng để có được DateTimeField trong khi nó vẫn còn "Không", trước khi nó đã được thiết lập ở cấp db.

Trả lời

8

Không, bạn không làm gì sai. Đây là một lỗi trong django-mptt.

Về cơ bản các trường ngày giờ với auto_add_now=True không nhận được giá trị cho đến sau khi django-mptt cố gắng tìm ra nơi để chèn mô hình của bạn vào cây.

Tôi vừa mới tạo ra một vấn đề về django-mptt để sửa lỗi này: https://github.com/django-mptt/django-mptt/issues/175

Trong khi đó, bạn có thể làm việc này bằng cách chủ động thiết lập các giá trị bản thân. Loại bỏ các auto_now_add=True và đặt giá trị trong phương thức save() ghi đè trên mô hình của bạn ::

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) 
Các vấn đề liên quan