Django Rest Framework如何根据ID保存具有相关字段的模型

     2023-02-23     78

关键词:

【中文标题】Django Rest Framework如何根据ID保存具有相关字段的模型【英文标题】:Django Rest Framework how to save a model with Related Field based on ID 【发布时间】:2015-01-17 16:17:31 【问题描述】:

我对 DRF 有点陌生。我的 Record 模型看起来像这样:

class Records(models.Model):
    owner = models.ForeignKey(User, null=True)
    activity = models.ForeignKey(Activity, null=True)
    time_start = models.DateTimeField(null=True)
    time_end = models.DateTimeField(null=True)

  ...

RecordSerializer 就是这个:

class RecordSerializer(serializers.ModelSerializer):

    now = datetime.today()
    owner = serializers.Field(source='owner.username')
    time_start = serializers.DateTimeField(source='now')

    class Meta:
        model = Records
        fields = ("owner", "activity", "time_start")

这是视图:

class StartApiView(generics.CreateAPIView):
    model = Records
    serializer_class = RecordSerializer

    def pre_save(self, obj):
        obj.owner = self.request.user

POST 请求是从 Backbone 发送的,它包含一个带有活动 ID 的字段,例如“activity:12”。如果我想让视图保存Record并将activity设置为id为12的Activity怎么办?

【问题讨论】:

【参考方案1】:

接受的答案对于 DRF v2.x 是正确的,但 is no longer for newer (3.x) versions,因为它会引发 AssertionError

AssertionError:关系字段必须提供queryset 参数,或设置read_only=True

对于较新的版本,只需添加 queryset 参数即可:

class RecordSerializer(serializers.ModelSerializer):
    activity = serializers.PrimaryKeyRelatedField(queryset=Activity.objects.all())
    // [...] 

【讨论】:

【参考方案2】:

Django REST Framework provides a PrimaryKeyRelatedField 正是这个用例。

class RecordSerializer(serializers.ModelSerializer):
    activity = serializers.PrimaryKeyRelatedField()
    owner = serializers.CharField(read_only=True, source='owner.username')
    time_start = serializers.DateTimeField(source='now')

    class Meta:
        model = Records
        fields = ("owner", "activity", "time_start")

这将产生类似于您正在寻找的输出,并且当您想要更新它时,它将接受活动的id

【讨论】:

感谢您的回答,非常有用的参考。我会在视图正常工作后立即接受它。现在我正在尝试解决另一个错误,我在这个问题上发布了它,也许你也可以帮我一把:***.com/questions/27030449/…。

根据请求类型更改 Django REST Framework ModelSerializer 中的字段?

】根据请求类型更改DjangoRESTFrameworkModelSerializer中的字段?【英文标题】:ChangeafieldinaDjangoRESTFrameworkModelSerializerbasedontherequesttype?【发布时间】:2016-11-1322:54:05【问题描述】:考虑这种情况,我有一个Book和Author模型。序列化器.pycl... 查看详情

如何在 django-rest-framework 中为 API 使用 TokenAuthentication

】如何在django-rest-framework中为API使用TokenAuthentication【英文标题】:HowtouseTokenAuthenticationforAPIindjango-rest-framework【发布时间】:2013-07-0718:26:11【问题描述】:我有一个django项目,使用django-rest-framework来创建api。想要使用基于令牌的... 查看详情

如何仅使用 django 作为后端并使用 django-rest-framework 发布

】如何仅使用django作为后端并使用django-rest-framework发布【英文标题】:Howtousedjangoonlyabackendandpostwithdjango-rest-framework【发布时间】:2016-11-2712:06:00【问题描述】:我将只使用Django作为后端。前端将使用React完成,没有django模板。我... 查看详情

如何优化查询 django rest-framework

】如何优化查询djangorest-framework【英文标题】:HowcanIoptimizequeriesdjangorest-framework【发布时间】:2018-11-2916:40:32【问题描述】:我有以下序列化程序classAutoSerializer(serializers.ModelSerializer):classMeta:model=Autofields=("nombre",)classMarcaSerial 查看详情

Django.rest_framework:如何序列化一对多?

】Django.rest_framework:如何序列化一对多?【英文标题】:Django.rest_framework:Howtoserializeonetomanytomany?【发布时间】:2014-09-0518:45:28【问题描述】:我在使用django进行序列化时遇到了一些问题。我有三个模型,比如说学校、房间和办... 查看详情

django-rest-framework:如何序列化已经包含 JSON 的字段?

】django-rest-framework:如何序列化已经包含JSON的字段?【英文标题】:django-rest-framework:HowDoISerializeaFieldThatAlreadyContainsJSON?【发布时间】:2014-04-0501:41:03【问题描述】:我对django-rest-framework还是很陌生,所以需要一些帮助。我有一... 查看详情

Django Rest Framework 如何更新 SerializerMethodField

】DjangoRestFramework如何更新SerializerMethodField【英文标题】:DjangoRestFrameworkHowtoupdateSerializerMethodField【发布时间】:2016-09-2508:12:16【问题描述】:我有一个这样的序列化器:classPersonSerializer(serializers.ModelSerializer):gender=serializers.Ser 查看详情

如何在 Select2 中处理从 Django REST Framework 本地提取的数据?

】如何在Select2中处理从DjangoRESTFramework本地提取的数据?【英文标题】:HowtoprocesslocallywithdrawndatafromDjangoRESTFrameworkinSelect2?【发布时间】:2016-10-2811:53:42【问题描述】:我正在尝试根据他们网站上的示例处理从select2插件中的DjangoR... 查看详情

如何使用 django-rest-framework 进行社交登录? [关闭]

】如何使用django-rest-framework进行社交登录?[关闭]【英文标题】:Howexactlyworkasocialloginwithdjango-rest-framework?[closed]【发布时间】:2015-11-2916:50:57【问题描述】:我需要创建一个Web服务来登录用户。此Web服务将从Android或iOS应用程序调... 查看详情

如何更改 django-rest-framework 的 authtoken 中的现有令牌?

】如何更改django-rest-framework的authtoken中的现有令牌?【英文标题】:HowcanIchangeexistingtokenintheauthtokenofdjango-rest-framework?【发布时间】:2014-01-0803:31:50【问题描述】:保存失败:fromrest_framework.authtoken.modelsimportTokentoken=Token.objects.get 查看详情

Django - 如何使用 Django Rest Framework 按日期过滤?

】Django-如何使用DjangoRestFramework按日期过滤?【英文标题】:Django-HowtofilterbydatewithDjangoRestFramework?【发布时间】:2016-09-0802:41:57【问题描述】:我有一些带有时间戳字段的模型:models.pyclassEvent(models.Model):event_type=models.CharField(max_l... 查看详情

如何在 Django Rest Framework 中为特定应用设置权限

】如何在DjangoRestFramework中为特定应用设置权限【英文标题】:HowsetpermissionforspecificappinDjangoRestFramework【发布时间】:2018-03-0122:09:15【问题描述】:我的Django项目中有两个REST应用程序:api-应该是AllowAny和ReadOnly!apicrm-应该是rest_fr... 查看详情

如何在 django-rest-framework 中对权限进行单元测试?

】如何在django-rest-framework中对权限进行单元测试?【英文标题】:Howtounittestpermissionsindjango-rest-framework?【发布时间】:2016-09-0708:14:14【问题描述】:她的权限是我想要进行单元测试的示例权限。#permissions.pyfrommyapp.modelsimportMembersh... 查看详情

扩展 django 用户 django-rest_framework 给了我 KeyError

】扩展django用户django-rest_framework给了我KeyError【英文标题】:ExtendingdjangoUserdjango-rest_frameworkgivesmeKeyError【发布时间】:2017-02-1719:01:52【问题描述】:我是djangorest_framework的新手,并且有问题,我已经根据django文档扩展了auth_user,... 查看详情

如何使用 TemplateHTMLRenderer 在 Django-REST-Framework 中创建/放置?

】如何使用TemplateHTMLRenderer在Django-REST-Framework中创建/放置?【英文标题】:HowdoIuseTemplateHTMLRendererforCreate/PutinDjango-REST-Framework?【发布时间】:2019-04-1512:45:20【问题描述】:我很难找到正确的方法来初始化TemplateHTMLRenderer以呈现用... 查看详情

如何在 Django Rest Framework 中散列 Django 用户密码?

】如何在DjangoRestFramework中散列Django用户密码?【英文标题】:HowtoHashDjangouserpasswordinDjangoRestFramework?【发布时间】:2017-05-1023:51:41【问题描述】:我正在尝试使用DjangoRestFramework为我的用户注册创建一个API。我按照api-guide中的步骤... 查看详情

DRF:如何将 django-rest-framework-jwt 集成到 Djoser

】DRF:如何将django-rest-framework-jwt集成到Djoser【英文标题】:DRF:howtointegratedjango-rest-framework-jwttoDjoser【发布时间】:2015-07-0811:05:22【问题描述】:我打算用DjangoRestFramework构建一个应用程序。我对使用Django-Rest-Framework-JWT身份验证机... 查看详情

如何缓存 Django Rest Framework API 调用?

】如何缓存DjangoRestFrameworkAPI调用?【英文标题】:HowtocacheDjangoRestFrameworkAPIcalls?【发布时间】:2016-11-1404:07:29【问题描述】:我使用Memcached作为我的django应用程序的后端。此代码在正常的django查询中工作正常:defget_myobj():cache_key... 查看详情