2016-09-15 71 views
0

Django的1.10GenericForeignKey和on_delete = models.PROTECT

说,我帧的实例,并为它的两条意见。 关键时刻:注释模型中的on_delete = models.PROTECT。

在外壳:

Comment.objects.all() 
<QuerySet [<Comment: Some comment.>, <Comment: 
Second comment.>] 

然后我删除帧实例(调用FrameDelete)。并且:

Comment.objects.all() 
<QuerySet []> 

空的。删除所有评论。而models.PROTECT没有帮助。

那么,我不能让它赶上IntegrityError。你能告诉我,如果可能和如何做?

class FrameDelete(IntegrityErrorMixin, DeleteView): 
    model = Frame 

class IntegrityErrorMixin(): 
    def delete(self, request, *args, **kwargs): 
     self.object = self.get_object() 
     success_url = self.get_success_url() 
     try: 
      self.object.delete() 
     except IntegrityError as err: 
      raise PermissionDenied 

     return HttpResponseRedirect(success_url) 

class Frame(models.Model): 
    ..... 
    comments = GenericRelation(Comment) 

class Comment(models.Model): 
    date = models.DateTimeField(null=False, 
          blank=False, 
          auto_now_add=True) 

    author = models.ForeignKey(User, on_delete=models.PROTECT) 
    body = models.TextField(blank=False, 
          null=False, 
          default="", 
          verbose_name = "",) # Empty. No need to show the verbose_name on the form. 

    content_type = models.ForeignKey(ContentType, on_delete=models.PROTECT) 
    object_id = models.PositiveIntegerField() 
    content_object = GenericForeignKey('content_type', 'object_id') 

回答

4

你传入on_delete=models.PROTECT的外键ContentType。这仅在删除内容类型时才起作用,而不是在删除注释时起作用。

documentation states

ForeignKey的不同,GenericForeignKey不接受on_delete 参数自定义此行为;如果需要,您可以简单地通过不使用GenericRelation来避免 级联删除,并且可以通过pre_delete信号提供替代 行为。

因此模拟的models.PROTECT的行为,则需要附加pre_delete信号是否存在任何相关评论认为,抛出一个异常,这样的事情:

from django.db.models import ProtectedError, signals 

@receiver(signals.pre_delete, Frame) 
def protect_delete(sender, instance, **kwargs): 
    if instance.comments.exists(): 
     raise ProtectedError() 
相关问题