我有以下问题:
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
答案 0 :(得分:1)
您有三种选择:
最快,最苛刻的是根据Gift
创建新的ProblematicGift
,然后删除ProblematicGift
。
您可以使用抽象继承使Gift
成为基本类型,然后将其子类化以创建ProblematicGift
和GoodGifts
之类的内容。之后的过程几乎相同:它们各自获得单独的表,因此您添加GoodGift
然后删除ProblematicGift
。它与#1几乎相同,但更具语义性。
可能是您的最佳选择:使用代理模型。您将布尔属性添加到“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()
编辑:将note
从ProblematicGift
移至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。