我正在使用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。我要做什么呢?
答案 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
字段,以访问促销代码