2010-10-19 25 views
1

我試圖批量刪除Django網站的一個開發實例上的所有註釋,並且Django引發了一個AttributeException異常。AttributeError嘗試批量刪除Django中的項目時引發異常

我已經有了一個Python提示符下輸入以下代碼:

>>> from django.contrib.comments.models import Comment 
>>> Comment.objects.all().delete() 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/home/jeff/.virtualenvs/osl_main-website/lib/python2.6/site-packages/django/db/models/query.py", line 441, in delete 
    obj._collect_sub_objects(seen_objs) 
    File "/home/jeff/.virtualenvs/osl_main-website/lib/python2.6/site-packages/django/db/models/base.py", line 569, in _collect_sub_objects 
    sub_obj._collect_sub_objects(seen_objs, self, related.field.null) 
    File "/home/jeff/.virtualenvs/osl_main-website/lib/python2.6/site-packages/django/db/models/base.py", line 585, in _collect_sub_objects 
    delete_qs = rel_descriptor.delete_manager(self).all() 
AttributeError: 'ReverseSingleRelatedObjectDescriptor' object has no attribute 'delete_manager' 

我不知道,爲什麼delete語句不工作。任何人都可以幫助我,爲什麼這不工作,我能做些什麼來解決它?

關於我的模型的更多細節:

我有一個名爲OslComment另一種模式,從Comment繼承。我也有一個Vote模型,指向OslComment中的條目。

BaseCommentAbstractModel

class BaseCommentAbstractModel(models.Model): 
    """ 
    An abstract base class that any custom comment models probably should 
    subclass. 
    """ 

    # Content-object field 
    content_type = models.ForeignKey(ContentType, 
      verbose_name=_('content type'), 
      related_name="content_type_set_for_%(class)s") 
    object_pk  = models.TextField(_('object ID')) 
    content_object = generic.GenericForeignKey(ct_field="content_type", fk_field="object_pk") 

    # Metadata about the comment 
    site  = models.ForeignKey(Site) 

評論

class Comment(BaseCommentAbstractModel): 
    """ 
    A user comment about some object. 
    """ 

    # Who posted this comment? If ``user`` is set then it was an authenticated 
    # user; otherwise at least user_name should have been set and the comment 
    # was posted by a non-authenticated user. 
    user  = models.ForeignKey(User, verbose_name=_('user'), 
        blank=True, null=True, related_name="%(class)s_comments") 
    user_name = models.CharField(_("user's name"), max_length=50, blank=True) 
    user_email = models.EmailField(_("user's email address"), blank=True) 
    user_url = models.URLField(_("user's URL"), blank=True) 

    comment = models.TextField(_('comment'), max_length=COMMENT_MAX_LENGTH) 

    # Metadata about the comment 
    submit_date = models.DateTimeField(_('date/time submitted'), default=None) 
    ip_address = models.IPAddressField(_('IP address'), blank=True, null=True) 
    is_public = models.BooleanField(_('is public'), default=True, 
        help_text=_('Uncheck this box to make the comment effectively ' \ 
           'disappear from the site.')) 
    is_removed = models.BooleanField(_('is removed'), default=False, 
        help_text=_('Check this box if the comment is inappropriate. ' \ 
           'A "This comment has been removed" message will ' \ 
           'be displayed instead.')) 

OslComment

class OslComment(Comment): 
    parent_comment = models.ForeignKey(Comment, blank=True, null=True, related_name='parent_comment') 
    inline_to_object = models.BooleanField(default=False) 
    edit_timestamp = models.DateTimeField() 
    transformed_comment = models.TextField(editable=False) 
    is_deleted_by_user = models.BooleanField(default=False) 

投票

class Vote(models.Model): 
    """ 
    A vote on an object by a User. 
    """ 
    user   = models.ForeignKey(User) 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    object  = generic.GenericForeignKey('content_type', 'object_id') 
    vote   = models.SmallIntegerField(choices=SCORES) 

其它信息:

Python的版本:2.6.5
操作系統:Linux薄荷9(Linux的2.6.32-21-通用)
Django的:1.2
數據庫驅動程序:postgresql_psycopg2(2.2.1)

+1

是否有其他模型依賴於'Comment'模型?什麼ForeignKey屬性引用評論?我猜你的數據庫有更多的「評論」模型。 – 2010-10-19 02:14:08

+0

@ S.Lott這是真的,我有一個模型,從'Comment'模型繼承來添加一些額外的字段,我使用'django-voting'的'Vote'表,它有幾個條目指向到繼承模型。在這種情況下,Django不會執行「CASCADE DELETE」嗎? – 2010-10-19 02:41:49

+0

@jeff charles:「在這種情況下,Django不會執行CASCADE DELETE嗎?」爲什麼呢?你從哪裏閱讀過文檔?是什麼給了你這個想法呢? – 2010-10-19 02:43:21

回答

1

編輯:本來我以爲你不能在一個QuerySet上執行delete()並且要推薦修補你迭代的項目,但顯然你可以做這樣的批量刪除。儘管遍歷QuerySet可能會給你一個更好的線索,看看有什麼不對。

+0

忘記了這個:http://docs.djangoproject.com/en/1.2/ref/models/instances/#deleting-objects – 2010-10-19 02:05:41

+0

對QuerySet進行迭代不會引發任何異常,並且可以像我期望的那樣工作 – 2010-10-19 02:37:49

+0

對不起,迭代沒有刪除似乎按預期工作(將嘗試w /刪除明天早上) – 2010-10-19 02:44:37

相關問題