【问题标题】:Django Restframework: update an object without accesing specific object idDjango Rest Framework:更新对象而不访问特定对象ID
【发布时间】:2015-09-30 18:11:56
【问题描述】:

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

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

我想在访问时更新某个代码

/促销代码/

不指定 id。我需要做什么?

【问题讨论】:

  • 如果没有 id,您打算如何确定要更新的对象?
  • 选择与介绍的促销代码相匹配的促销代码

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


【解决方案1】:

我找到了 3 个解决我的问题的方法。我已经测试了其中的 2 个:

  • 第一个解决方案:我创建了另一个名为PromotionalCodesHistory(models.Model) 的模型,其属性与PromotionalCode 相同,并使用方法create 创建了一个序列化程序,创建了一个PromotionalCodesHistory 实例并调用更新方法来更新PromotionalCode .然后,当我访问 URL /promotional/ 时,我可以更新促销代码。

  • 第二种解决方案:修改DefaultRouter()以访问更新/promotional/ url,通过以下代码:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-22
    • 2014-06-23
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2018-01-08
    相关资源
    最近更新 更多