Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将destroy()与pk以外的参数一起使用_Python_Django_Django Rest Framework - Fatal编程技术网

Python 将destroy()与pk以外的参数一起使用

Python 将destroy()与pk以外的参数一起使用,python,django,django-rest-framework,Python,Django,Django Rest Framework,TLDR-->是否可以使用某个参数而不是pk来销毁数据库中的项目 我正在DRF应用程序中使用ViewSet。我对destroy()-ing一些查询集项目感兴趣。我想避免使用pk,我可以这样做吗?我的近似模型/方法如下 class MyAwesomeMode(models.Model): awesome_field = models.CharField(max_length = 256) # some other fields 现在,我打算销毁()Queryset元素,而不使用pk和aw

TLDR-->是否可以使用某个参数而不是pk来销毁数据库中的项目

我正在DRF应用程序中使用ViewSet。我对
destroy()
-ing一些查询集项目感兴趣。我想避免使用
pk
,我可以这样做吗?我的近似模型/方法如下

class MyAwesomeMode(models.Model):
  awesome_field = models.CharField(max_length = 256)
  # some other fields
现在,我打算
销毁()
Queryset元素,而不使用
pk
awesome\u字段。我需要如何处理我的ViewSet?

由于您使用并且该类扩展自
ViewSetMixin
views.APIView
,因此
.destroy()
方法不可用

您需要从扩展来使用该方法

关于您的问题,请首先查看
.destroy()
源代码:

def destroy(self, request, *args, **kwargs):
    instance = self.get_object()  # Here is getting the object!
    self.perform_destroy(instance)
    return Response(status=status.HTTP_204_NO_CONTENT)
因此,假设您在请求中提供了一个
唯一的\u名称
参数,您可以覆盖
.get\u object()
方法:

class MyView(ViewSet, DestroyModelMixin):

    def get_object(self):
        return MyModel.objects.get(unique_name=request.data.get('unique_name'))

然后,当
.destroy()
调用
self.get\u object()
时,您将使用您的方法,根据
pk
的虚构
唯一\u name
字段istead获得对象,我甚至不知道
destroy()
函数从何而来。请为您的问题添加更多上下文。@ShangWang我正在我的DRF应用程序中使用ViewSet。您在此视图中使用的是什么ViewSet?有关详细信息,请随时参阅
destroy()
是由提供的一种方法,用于删除可由唯一URL标识的DB条目。
ViewSet.ViewSet
并向其添加
list()
retrieve()
等。这样做会使其变得不必要的复杂。我这边的解决方案很简单。我添加了
lookup\u field=“my\u awesome\u field”
并将我的方法更改为
destroy(self,request,my\u awesome\u field=None)
并在
destroy()
@MuhammadFahadManzoor中进行了查询集过滤和删除,或者我的解决方案只是重写
获取对象
,其他代码就是一个解释。您的解决方案适用于这种情况,这是一个特定的解决方案,我的解决方案可以适用于许多其他类,使用超级类中的
get\u object
。我很高兴你找到了解决办法。