如何通过DateTimeField订购django-mptt树?

时间:2012-03-07 05:03:12

标签: python django django-mptt

这是我正在使用的模型:

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']

然而,当我尝试从管理站点添加评论时,我得到:

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

我的模特出了什么问题?我觉得django-mptt尝试获取DateTimeField,而它仍然是“None”,然后才在db级别设置。

1 个答案:

答案 0 :(得分:8)

不,你没有做错事。这是django-mptt中的一个错误。

基本上auto_add_now=True的日期时间字段在django-mptt尝试找出在树中插入模型的位置之前不会得到值。

我刚刚在django-mptt上创建了一个问题来解决这个问题:https://github.com/django-mptt/django-mptt/issues/175

与此同时,您可以通过自己主动设置值来解决此问题。摆脱auto_now_add=True,并在模型上重写的save()方法中设置值::

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)