redifine方法在Django Rest Framework的modelviewset中删除或销毁

时间:2017-01-21 09:10:01

标签: python django django-rest-framework

我有一个特殊的删除,所以我不能只使用DELETE方法。

这是模型:

class PersonalDetail(models.Model):
    icon = models.URLField(_('icon'), max_length=500, blank=True, default='')
    date = models.DateTimeField(_('date'), auto_now_add=True)
    checked = models.BooleanField(_('checked'), blank=True, default=False)
    priority = models.CharField(_('priority'), blank=True, max_length=1)
    preview_title = models.CharField(_('preview_title'), blank=True, max_length=100)
    preview_text = models.TextField(_('preview_text'), blank=True)
    preview_name = models.CharField(_('preview_name'), blank=True, max_length=100)
    type = models.CharField(_('type'), choices=PERSONAL_DETAILS_INFO, default='Info', max_length=100, blank=False)
    content = JSONField(_('content'))
    user_id = models.ForeignKey(User, related_name='userId', on_delete=models.CASCADE)

关键是,当“类型”为messagefacebookpostinfo时,我必须删除iconid和{{ {1}}。到现在为止,我可以使用某种PUT。但是......当“类型”是preview_title时,我必须删除所有内容,就像正常删除一样。

所以,我不知道如何做到这一点。我想也许我可以使用类似userdefined的东西并覆盖它。例如,我知道如何覆盖.destroy()perfom_create(),但没有删除任何内容。

我的观点看起来如此:

get_queryset()

也许有人知道该怎么做。

1 个答案:

答案 0 :(得分:0)

我解决了这个问题:

def perform_destroy(self, instance):
    if instance.type == 'userdefined':
        instance.delete()
    else:
        serializer = PersonalDetailSerializer(instance, data=self.request.data)

        serializer.is_valid()

        serializer.save(checked=False)
        serializer.save(preview_text='')
        serializer.save(preview_name='')
        serializer.save(content={"": ""})

我不确定它是否是最佳方式,但它确实有效。如果有人知道更好的方式,我会很感激答案。