Как удалить объект в админке и сохранить родительский? - PullRequest
1 голос
/ 09 июня 2011

У меня следующая проблема:

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

Ответы [ 2 ]

1 голос
/ 09 июня 2011

У вас есть три варианта:

  1. Самым быстрым и хакерским является создание нового Gift на основе ProblematicGift, а затем удаление 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()

РЕДАКТИРОВАТЬ: Перемещено note с ProblematicGift на Gift. При использовании прокси-моделей вы не можете добавлять новые поля в подкласс.

0 голосов
/ 09 июня 2011

Честно говоря, вы делаете ошибку, пытаясь унаследовать от 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.

...