如何在admin中删除对象并保留父对象?

时间:2011-06-09 18:02:52

标签: django model admin parent

我有以下问题:

class Gift(models.Model):                                            
    name        = models.CharField(max_length=255,default='')

class ProblematicGift(Gift):
    # it does not help  gift_ptr = models.OneToOneField(Gift, parent_link=True, default=None, null=True, blank=True, on_delete=models.DO_NOTHING)
    notes       = models.CharField(max_length=255,default='')

如何在管理界面中删除ProblematicGift的对象并保留Gift的对象?

简化背景:Automat选择有问题的礼物并将其添加到表中,管理员查看它,修复礼物并删除ProblematicGift

2 个答案:

答案 0 :(得分:1)

您有三种选择:

  1. 最快,最苛刻的是根据Gift创建新的ProblematicGift,然后删除ProblematicGift

  2. 您可以使用抽象继承使Gift成为基本类型,然后将其子类化以创建ProblematicGiftGoodGifts之类的内容。之后的过程几乎相同:它们各自获得单独的表,因此您添加GoodGift然后删除ProblematicGift。它与#1几乎相同,但更具语义性。

  3. 可能是您的最佳选择:使用代理模型。您将布尔属性添加到“is_problematic”之类的形式的礼物中。然后,创建ProblematicGift作为Gift的代理,在创建时自动将is_problematic设置为True,并覆盖管理器以仅返回is_problematic设置为True的礼物。然后,您只需将该属性设置为False,而不是删除ProblematicGift,它将离开查询集。

  4. -

    class Gift(models.Model):
        name           = models.CharField(max_length=255,default='')
        notes          = models.CharField(max_length=255,default='')
        is_problematic = models.BooleanField(default=False)
    
    class ProblematicGiftManager(models.Manager):
        def get_query_set(self, *args, **kwargs):
            qs = super(ProblematicGiftManager, self).get_query_set(*args, **kwargs)
            return qs.filter(is_problematic=True)
    
    class ProblematicGift(models.Model):
    
        objects        = ProblematicGiftManager()
    
        class Meta:
            proxy = True
    
        def save(self, *args, **kwargs):
            # Make sure it's new
            if not self.pk: 
                self.is_problematic = True
    
            super(ProblematicGift, self).save(*args, **kwargs)
    
        def resolve(self):
            self.is_problematic = False
            self.save()
    

    编辑:noteProblematicGift移至Gift。使用代理模型时,不能向子类添加任何新字段。

答案 1 :(得分:0)

老实说,你所犯的错误是试图继承Gift。您不希望为您的用例执行此操作。

最好的方法是让Gift成为独立模特:

class Gift(models.Model):                                            
    name = models.CharField(max_length=255,default='')

然后让ProblematicGift引用它:

class ProblematicGift(models.Model):
    gift = models.OneToOneField(Gift, null=True, blank=True)
    notes = models.CharField(max_length=255,default='')

    # this method added based on a comment
    def __unicode__(self):
        return self.gift.name

现在您可以安全地删除ProblematicGift。