0

我正在使用Django與Restframework,並且我想更新某個對象。我有以下型號:Django Restframework:更新一個對象,但不訪問特定對象ID

class PromotionalCode(models.Model): 
    promotional_code = models.CharField(max_length=10, default=random_with_letters(), unique=True) 
    myuser = models.ForeignKey('MyUser', related_name='promotional_code_user', blank=True, null=True) 
    promotion_type = models.PositiveIntegerField(default=1) 
    time_transaction = models.DateTimeField(default=datetime.now()) 
    used = models.BooleanField(default=False) 

以下視圖集:

class UpdateOnlyDetailViewSet(mixins.UpdateModelMixin, 
viewsets.GenericViewSet): 
    pass 

以下觀點:

class PromotionalCodeViewSet(UpdateOnlyDetailViewSet): 
    queryset = PromotionalCode.objects.all() 
    serializer_class = PromotionalCodeSerializer 
    permission_classes = (IsOwnerOrReadOnly,) 

而且它具有以下網址:

router = DefaultRouter() 
router.register(r'promotionalcode', views.PromotionalCodeViewSet) 

我只能更新Promotionalcod Ë對象時我訪問

/promotionalcode/code_id

,我想,當我訪問

/promotionalcode更新某一碼/

而不指定id。我需要做的是做什麼?

+0

你怎麼打算找出哪些對象,而其ID更新? – miki725

+0

選擇與推出的促銷代碼相匹配的促銷代碼 – david

回答

0

我找到了3個解決方案來解決我的問題。我測試了2人:

  • 解決方案一:我已經創建了相同的屬性稱爲PromotionalCodesHistory(models.Model)另一種模式爲PromotionalCode和創建方法的串行創建,創建PromotionalCodesHistory實例,並調用更新方法來更新PromotionalCode 。然後,當我訪問url /promotional/我可以更新促銷代碼。

  • 解決方法二:修改DefaultRouter()訪問對/promotional/網址更新,通過下面的代碼:

from rest_framework.routers import DefaultRouter class CustomUpdateRouter(DefaultRouter): routes = [ # List route. Route( url=r'^{prefix}{trailing_slash}$', mapping={ 'get': 'list', 'post': 'create', 'put': 'update', 'patch': 'partial_update', }, name='{basename}-list', initkwargs={'suffix': 'List'} ), # Dynamically generated list routes. # Generated using @list_route decorator # on methods of the viewset. DynamicListRoute( url=r'^{prefix}/{methodname}{trailing_slash}$', name='{basename}-{methodnamehyphen}', initkwargs={} ), # Detail route. Route( url=r'^{prefix}/{lookup}{trailing_slash}$', mapping={ 'get': 'retrieve', 'delete': 'destroy' }, name='{basename}-detail', initkwargs={'suffix': 'Instance'} ), # Dynamically generated detail routes. # Generated using @detail_route decorator on methods of the viewset. DynamicDetailRoute( url=r'^{prefix}/{lookup}/{methodname}{trailing_slash}$', name='{basename}-{methodnamehyphen}', initkwargs={} ), ] 然後,在視圖類,重新實現get_object方法來指定自己的過濾器,以獲得對象,可以訪問到get_serializer_context方法來獲得上下文數據時,使用Unicode的一個詞典中指定的過濾器,如下面的:

{u'key': unicode(variable1), u'key2': unicode(variable2)} 
  • 解決方案三:最後的解決方案,我沒有測試過,是主鍵更改爲promotional_code領域,進入促銷代碼,使用/promotionalcode/promotional_code