相关疑难解决方法(0)

Django admin:覆盖删除方法

我有admin.py如下:

  class profilesAdmin(admin.ModelAdmin):
     list_display = ["type","username","domain_name"]
Run Code Online (Sandbox Code Playgroud)

现在我想在删除对象之前执行一些操作:

  class profilesAdmin(admin.ModelAdmin):
     list_display = ["type","username","domain_name"]

     @receiver(pre_delete, sender=profile)
     def _profile_delete(sender, instance, **kwargs):
        filename=object.profile_name+".xml"
        os.remove(os.path.join(object.type,filename))
Run Code Online (Sandbox Code Playgroud)

如果我使用像这样的删除信号方法我得到一个错误说self应该是第一个参数.

如何修改上述功能?
我想检索被删除对象的profile_name.如何才能做到这一点?

我也尝试重写delete_model方法:

def delete_model(self, request, object):
    filename=object.profile_name+".xml"
    os.remove(os.path.join(object.type,filename))
    object.delete()
Run Code Online (Sandbox Code Playgroud)

但如果必须一次删除多个对象,这不起作用.

django django-admin

17
推荐指数
3
解决办法
2万
查看次数

在Django中软删除对象

我正在尝试为Django模型实现通用的软删除模式。

为模型提供一个is_deleted字段,该字段将已删除的对象保留在DB中,但出于所有实际目的将其隐藏:应遵循级联等所有常规规则,但实际删除除外。但是,管理应用程序仍应能够使用已删除的对象,以擦除(确定将其丢弃)或还原它们。(请参见下面的代码)

问题:这会中断级联。我原本希望发生的事情是通过我在模型和自定义查询集上覆盖的方法来进行级联。实际发生的是,它们被默认的查询集/管理器绕过,默认查询集/管理器也恰好使用了快速的_raw_delete内部API。因此,要么不会发生级联删除,要么如果我在模型上调用super()。delete()方法(此后再调用save()),则对相关对象执行标准删除。

我已经尝试了“使用自定义模型删除方法进行级联删除”中的建议,但是这很糟糕—除了提倡使用已弃用的use_for_related_fields管理器属性。

我开始认为,要实现我的目标就不可能不影响Django私有对象的主要区别-很奇怪,因为这种软删除行为是许多DBMS情况下的标准模式。

这是我现在的位置:

  • 我为具有is_deleted字段的对象创建了自定义管理器和查询集:

    from django.db import models
    from django.db.models.query import QuerySet
    
    
    class SoftDeleteQuerySet(QuerySet):
        #/sf/ask/2022736621/
        def __init__(self,*args,**kwargs):
            return super(self.__class__,self).__init__(*args,**kwargs)
    
        def delete(self,*args,**kwargs):
            for obj in self: obj.delete()
    
    #http://codespatter.com/2009/07/01/django-model-manager-soft-delete-how-to-customize-admin/
    # but use get_queryset,  not get_query_set !!!
    class SoftDeleteManager(models.Manager):
        """ Use this manager to get objects that have a is_deleted field """
        def get_queryset(self,*args,**kwargs):
            return SoftDeleteQuerySet(model=self.model, using=self._db, hints=self._hints).filter(is_deleted=False)
    
        def all_with_deleted(self,*args,**kwargs):
            return SoftDeleteQuerySet(model=self.model, using=self._db, hints=self._hints).filter()
    
        def deleted_set(self,*args,**kwargs):
            return SoftDeleteQuerySet(model=self.model, using=self._db, hints=self._hints).filter(is_deleted=True)
    
        def get(self, *args, **kwargs):
            """ if …
    Run Code Online (Sandbox Code Playgroud)

django django-models

7
推荐指数
2
解决办法
3804
查看次数

OneToOne Model 删除 Cascade 的两种方式

我有 2 个型号:

   class A(models.Model):
        name = models.CharField(max_length=50)


        def __str__(self):
            return "%s the place" % self.name

    class B(models.Model):
        a = models.OneToOneField(Place,on_delete=models.CASCADE)
        name = models.CharField(max_length=50)
Run Code Online (Sandbox Code Playgroud)

我想:

  1. 如果A被删除,B也会被删除(有效)
  2. 如果 B 被删除,A 也会被删除

django django-models

4
推荐指数
1
解决办法
1131
查看次数

在 Django 模型字段中自定义 `on_delete` 参数函数

我有一个 IPv4Manage 模型,其中有一个vlanedipv4network字段:

class IPv4Manage(models.Model):
    ...
    vlanedipv4network = models.ForeignKey(
        to=VlanedIPv4Network, related_name="ipv4s", on_delete=models.xxx, null=True)
Run Code Online (Sandbox Code Playgroud)

众所周知,在on_deleteparam 上,我们一般会填充models.xxx,例如models.CASCADE

是否可以自定义一个函数,在那里填充?我想在那里做其他逻辑事情。

python django

3
推荐指数
2
解决办法
3574
查看次数

标签 统计

django ×4

django-models ×2

django-admin ×1

python ×1