2011-06-09 87 views
1

我有以下问题:如何在admin中删除对象并保留父项?

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的对象管理界面,并保持礼物的对象?

简体背景:自动售货机选择有问题的礼物,并把它添加到表,其中管理员看看吧,修复礼物,删除ProblematicGift

回答

1

你有三种选择:

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

  2. 您可以使用抽象继承使Gift成为原始类型,然后对其进行子类化以创建ProblematicGift s和类似GoodGifts的东西。之后的过程几乎相同:它们各自获得单独的表格,因此您添加一个GoodGift,然后删除ProblematicGift。它与#1几乎相同,但是更多语义。

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

-

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() 

编辑:搬离ProblematicGiftnoteGift。使用代理模型时,不能将任何新字段添加到子类中。

+0

3选项是有趣的想法:)我会试试看,谢谢 – Jarek 2011-06-09 19:20:25

+0

只有一个问题,这是怎么在这个问题GiftmaticGift链接到礼品? – Jarek 2011-06-09 19:22:02

+0

它在技术上不是“连接”的。这基本上是一个别名。 'ProblematicGift'被设置为访问具有'is_problematic' == True的'Gift'的简单方法。它基本上仍然只是“礼物”伪装成不同的对象。 – 2011-06-09 19:35:18

0

老实说,你所犯的错误是试图从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。

+0

是的,我预先准备好了,但是通过这段代码,我没有直接在管理页面看到礼物名称。只有对象的链接,很难在吨记录中找到prooper礼物。 – Jarek 2011-06-09 19:14:04

+0

因此定义一个'__unicode__'函数。它甚至可以'返回unicode(self.gift)'。 – 2011-06-09 19:32:55

+0

有没有办法编辑这个“名称”在管理页面problematicgift? – Jarek 2011-06-09 19:57:56

相关问题