2017-01-21 9 views
0

私は特別な削除があるので、単にDELETEメソッドを使用することはできません。redifineメソッドDjango Rest Frameworkのmodelviewsetで削除または破棄します

これはモデルです:

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) 

ポイントは、私はiconidpreview_title除いて削除する必要があり、 "タイプ" はmessagefacebookpostまたはinfoあるとき、あります。これまでは、PUTを使用することができました。しかし... "タイプ"がuserdefinedの場合、通常の削除のようにすべてを削除する必要があります。

私はそれがどうやってできるのか分かりません。私はおそらく.destroy()のようなものを使用してそれを上書きできると思った。たとえば、perfom_create()またはget_queryset()を無効にする方法はわかっていますが、削除はありません。

私の見解はそうなります

class PersonalDetailViewSet(viewsets.ModelViewSet): 
    queryset = PersonalDetail.objects.all() 
    serializer_class = PersonalDetailSerializer 

    def get_queryset(self): 
     return PersonalDetail.objects.filter(Q(user_id=self.request.user)) 

    def perform_create(self, serializer): 
     serializer.save(user_id=self.request.user) 

    # Not delete icon, id, preview_title 

はたぶん誰かがそれを行う方法を知っています。

答えて

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={"": ""}) 

は、私はそれが最善の方法だかはわからないが、それは動作します。誰かがより良い方法を知っているなら、私は答えを感謝します。

関連する問題