Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >ValueError:在put请求/查找字段中不能将整数赋值给外键作为外键子字段

ValueError:在put请求/查找字段中不能将整数赋值给外键作为外键子字段
EN

Stack Overflow用户
提问于 2021-01-08 01:36:22
回答 1查看 263关注 0票数 1

所以我有个这样的模特。

代码语言:javascript
运行
AI代码解释
复制
class Member(BaseModel):

    objects = models.Manager()
    user = models.ForeignKey('api_backend.User', db_index=True, on_delete=models.CASCADE)
    cluster = models.ForeignKey('api_backend.Cluster', on_delete=models.CASCADE)

以及相同的通用api视图。

代码语言:javascript
运行
AI代码解释
复制
lass MemberPutRetrieveUpdateDeleteView(PutAsCreateMixin, MultipleFieldLookupMixin, generics.RetrieveUpdateDestroyAPIView):
    queryset = api_models.Member.objects.all()
    permission_classes = [permissions.IsAuthenticated, IsMemberOrKickMembers]
    lookup_fields = ['user', 'cluster']

    def get_serializer_class(self):
        if self.request.method in ['PUT']:
            return api_serializers.PartialMemberSerializer
        return api_serializers.MemberSerializer

    def destroy(self, request, *args, **kwargs):
        member = self.get_object()
        if member.cluster.owner == member.user:
            raise exceptions.ValidationError("cannot delete membership with this cluster as you own it.")
        return super(MemberPutRetrieveUpdateDeleteView, self).destroy(request, *args, **kwargs)

我目前正在使用这些混合器。

代码语言:javascript
运行
AI代码解释
复制
class PutAsCreateMixin(object):
    """
    The following mixin class may be used in order to support PUT-as-create
    behavior for incoming requests.
    """

    def update(self, request, **kwargs):
        partial = kwargs.pop('partial', False)
        instance = self.get_object_or_none()
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)

        if instance is None:
            if not self.lookup_fields:
                lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field
                lookup_value = self.kwargs[lookup_url_kwarg]
                extra_kwargs = {self.lookup_field: lookup_value}
            else:
                # add kwargs for additional fields
                extra_kwargs = {field: self.kwargs[field] for field in self.lookup_fields if self.kwargs[field]}
            serializer.save(**extra_kwargs)
            return Response(serializer.data, status=201)

        serializer.save()
        return Response(serializer.data)

    def partial_update(self, request, *args, **kwargs):
        kwargs['partial'] = True
        return self.update(request, *args, **kwargs)

    def get_object_or_none(self):
        try:
            return self.get_object()
        except Http404:
            if self.request.method == 'PUT':
                # For PUT-as-create operation, we need to ensure that we have
                # relevant permissions, as if this was a POST request.  This
                # will either raise a PermissionDenied exception, or simply
                # return None.
                self.check_permissions(clone_request(self.request, 'POST'))
            else:
                # PATCH requests where the object does not exist should still
                # return a 404 response.
                raise


class MultipleFieldLookupMixin(object):
    """
    Apply this mixin to any view or viewset to get multiple field filtering
    based on a `lookup_fields` attribute, instead of the default single field filtering.
    """

    def get_object(self):
        queryset = self.get_queryset()  # Get the base queryset
        queryset = self.filter_queryset(queryset)  # Apply any filter backends
        filter = {}
        for field in self.lookup_fields:
            if self.kwargs[field]:  # Ignore empty fields.
                filter[field] = self.kwargs[field]
        obj = get_object_or_404(queryset, **filter)  # Lookup the object
        self.check_object_permissions(self.request, obj)
        return obj

因此,在我的序列化程序中,我有多个查找字段- -usercluster。这两个都是外键,在url中都有自己的kwargs。

所以我的api url是这样的。

代码语言:javascript
运行
AI代码解释
复制
path('clusters/<int:cluster>/members/<int:user>/', views.MemberPutRetrieveUpdateDeleteView.as_view())

我希望一个样本url是这样的:

代码语言:javascript
运行
AI代码解释
复制
'clusters/3/members/2/'

其中1是集群的id,2是成员的id。因此,基本上,对这个url的put请求必须创建一个成员,该成员具有:

  • 是id 2
  • 的用户外键,id 3

的集群外键

但是,当试图创建相同的混音时,我会得到以下错误。

代码语言:javascript
运行
AI代码解释
复制
in __set__
    self.field.remote_field.model._meta.object_name,
ValueError: Cannot assign "2": "Member.user" must be a "User" instance.

如何纠正此错误?有人能帮帮我吗?非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-08 19:51:42

答案其实很简单,我希望这能节省很多时间。

我必须将查找字段更改为

代码语言:javascript
运行
AI代码解释
复制
lookup_fields = ['user_id', 'cluster_id']

和url kwargs到以下

代码语言:javascript
运行
AI代码解释
复制
'clusters/<int:cluster_id>/members/<int:user_id>/'

这样,django就知道url中只有外键的id,而不是外键对象本身。当使用查找字段执行-创建时,一切都像预期的那样工作!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65626527

复制
相关文章
1229|如何将SAP NetWeaver Gateway连接到SAP Business Suite?
如何将SAP NetWeaver Gateway连接到SAP Business Suite?
不会写代码的杰尼
2022/05/19
4030
1229|如何将SAP NetWeaver Gateway连接到SAP Business Suite?
CIO们必读:我与SAP Business One的十年众生态
此文写的非常好,由从事SAP B1十年销售工作的内部人分享,这一路来的风雨兼程,值得每一位从事管理软件的同行拜读一下。这是自己作为一名SAP Business One从业者十年的总结,也是一篇试图关注SAP business one在整个中国中小企业ERP市场生态状况的粗浅看法。我看不很远,看的也不一定很对,因为我依然身在此中。但还是想做个思考和总结,对往者,对在者,对来者做个参考!所以本文不针对任何ERP产品,只是作为一个从事SAP Business One 10年历程的回顾与总结。 SAP Busine
人称T客
2018/03/19
1.4K0
Adobe LiveCycle Designer for SAP Business ByDesign
2.到系统的下载中心并且打开“安装所有系统的附加软件”,路径是“应用和用户管理”->“业务灵活性”->“下载中心“->“安装所有系统的附加软件”
斯文的程序
2019/11/07
1.4K0
Adobe LiveCycle Designer for SAP Business ByDesign
[蓝帽杯 2021]One Pointer PHP | BUU
虽然这个比赛只有一个Web题但是质量确实挺高的,值得用一篇文章来记录一下 这道题主要核心内容就是打PHP-FPM服务的原理和方法
h0cksr
2023/05/17
6340
[蓝帽杯 2021]One Pointer PHP | BUU
如何使用Onedrive For Business
以教育版为例,商业版大同小异 以win10系统环境为例,其他系统大同小异,部分功能有阉割。 -1st- 注册 网址是:https://www.microsoft.com/en-us/education
Sidchen
2020/08/02
8K0
配置Oracle Gateway 12连接到SQL server 2014
最近的工作中需要基于Oracle连接到SQLserver2014,我们可以通过配置Gateway的方式来实现这个功能。这个Gateway的实质是透过dblink来实现的。即把SQLserver模拟成一个远端的Oracle实例,这个实例由Gateway来负责进行接收,转发等等。本文简要描述其配置过程。
Leshami
2018/08/13
3K0
配置Oracle Gateway 12连接到SQL server 2014
点击加载更多

相似问题

SAP Business one

42

将SAP Business One连接到SQL Server 2005时,

41

SAP Business One将交货表链接到OBTN表

127

SAP business one和HANA studio

11

Drupal Commerce和SAP Business One

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文