Django Restframework:更新对象而不访问特定的对象ID

时间:2015-09-30 18:11:56

标签: python django django-models django-views django-rest-framework

我正在使用Django和Restframework,我想更新某个对象。我有以下型号:

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)

我只能在访问

时更新Promotionalcode对象
  

/ promotionalcode / code_id

我想在访问

时更新某个代码
  

/ promotionalcode /

未指定ID。我要做什么呢?

1 个答案:

答案 0 :(得分:0)

我找到了3个问题的解决方案。我测试了其中两个:

  • 第一个解决方案:我创建了另一个名为PromotionalCodesHistory(models.Model)的模型,其属性与PromotionalCode相同,并使用方法create创建一个序列化程序,创建一个PromotionalCodesHistory实例并调用更新更新PromotionalCode的方法。然后,当我访问网址/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字段,以访问促销代码