- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一个奇怪的问题。我一直在使用 Django 和 DRF 以及前端的 React 来开发一个应用程序。我的应用程序有两个模型:放置和覆盖。每个地方都有封面图片,这是数据库架构。
图像表
+----+---------------------+----------+----------------------+
| pk | file | title | description |
+----+---------------------+----------+----------------------+
| 1 | /media/my-image.jpg | My Image | My Image Description |
+----+---------------------+----------+----------------------+
放置 table
+----+------+-------+
| pk | code | cover |
+----+------+-------+
| 1 | abcd | 1 |
+----+------+-------+
我的操作很简单。我将使用地点代码请求地点详细信息,DRF 将返回详细信息。这是我最初写的。
class ImageSerializer(ModelSerializer):
class Meta:
model = Image
fields = ["pk", "file", "title", "description"]
class PlaceDetailSerializer(ModelSerializer):
cover = ImageSerializer()
class Meta:
model = Place
fields = ["code", "cover"]
class PlaceDetailView(RetrieveAPIView):
serializer_class = PlaceDetailSerializer
permission_classes = []
queryset = Place.objects.filter(deleted=False, published=True)
lookup_field = 'code'
lookup_url_kwarg = 'code'
这是请求的输出
{
"code": "3469324020",
"cover": {
"pk": 13,
"file": "http://127.0.0.1:8000/media/my-image.jpg ",
"title": "My Image",
"description": ""
}
}
到目前为止一切都很好。因为我想要我的图像的完整网址,而这正是我所得到的。但是当我开始使用 SerializerMethodField()
class PlaceDetailSerializer(ModelSerializer):
cover = SerializerMethodField()
def get_cover(self, place):
return ImageSerializer(place.cover).data
class Meta:
model = Place
fields = ["code", "cover"]
这是更改后的新响应
{
"code": "3469324020",
"cover": {
"pk": 13,
"file": "/media/my-image.jpg",
"title": "My Image",
"description": ""
}
}
看到了吗? DRF 不再返回绝对 URL,而是相对 URL。我很好奇这是为什么?与DRF上下文参数有关吗?
我还注意到绝对 URL 也不适用于 APIView。
class PlaceDetailSerializer(ModelSerializer):
cover = ImageSerializer()
class Meta:
model = Place
fields = ["code", "cover"]
class PlaceDetailView( APIView ):
serializer_class = PlaceDetailSerializer
permission_classes = []
queryset = Place.objects.filter(deleted=False, published=True)
lookup_field = 'code'
lookup_url_kwarg = 'code'
def get(self, request, *args, **kwargs):
place = Place.objects.get(code=kwargs.get("code"))
return Response(PlaceDetailSerializer(place).data)
它还将返回相对 URL 作为输出。
现在我知道有一些方法可以使用 get_absolute_url()
或其他函数返回完整的 url。但我只是好奇为什么这不适用于 SerializerMethodField
或 APIView
。我希望如果您知道的话,您也许能够帮助我了解这里发生的事情。
最佳答案
您需要使请求可供序列化程序使用,如下所示:
return Response(PlaceDetailSerializer(place, context={'request': request}).data)
return ImageSerializer(place.cover, context={'request': request}).data
通常,Django Rest Framework 会为您执行此操作,但如果您手动调用序列化器类(例如在 MethodField 中),则还必须将请求作为上下文变量传递。
查看how the FileField is serialized :
request = self.context.get('request', None)
if request is not None:
return request.build_absolute_uri(url)
return url
如果您不将请求作为上下文变量传递,序列化程序将无法构建绝对 URL。
关于Django Rest Framework 使用 SerializerMethodField 返回相对路径而不是完整 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57728217/
我在对按 rest_framework 排序的 json 数据进行分页时遇到问题。的SerializerMethodField .在开始向 ListView 添加分页之前,我将排序后的 json 数据
这些是我的模型.py class Grade(models.Model): grade = models.CharField(max_length=255, primary_key=True)
我想使用 drf-flexfields 在模型序列化器中创建延迟方法字段。 我正在使用 Django Rest Framework 和 drf-flexfields。我想在模型序列化器中创建一个方法字
我有这个 Django REST Framework 序列化器类: class DoctorMeetingSerializer(serializers.ModelSerializer): do
我使用以下代码定义了一个序列化器: class TermSerializer(serializers.ModelSerializer): associatedVocabs = serializ
我正在使用 Django Rest Framework 3.0 并且我有一个模型: class Vote(models.Model): name = ... token = model
我有两个模型: from django.db import models STATUSES = ( ('f', 'Finished'), ) class Battery(models.Mode
我有一个模型方法,要求将请求用户作为额外参数传入: 模型方法: def has_achieved(self, user): return AwardLog.objects.filter(use
我有一个像这样的序列化器: class PersonSerializer(serializers.ModelSerializer): gender = serializers.Serializ
我正在我的 SerializerMethodField 中访问相关字段的数据,并且对正在呈现的每个对象都有一个查询。我的模型看起来像(为简洁起见,将保持简短): class Listing(model
我遇到了一个奇怪的问题。我一直在使用 Django 和 DRF 以及前端的 React 来开发一个应用程序。我的应用程序有两个模型:放置和覆盖。每个地方都有封面图片,这是数据库架构。 图像表 +---
我的 DRF 后端在这里遇到了一些小问题。 我正在用某些型号的选项填充字段。 我对一个模型有外键要求。当我创建模型时,我想将它保存在外国 ID 下。 当我请求模型时,无论选择字段映射到什么,我都想要模
我有一个具有嵌套序列化器字段的序列化器。我已经设置了急切加载,一切都运行良好。 但是,我必须向嵌套字段添加一些自定义过滤,这需要 SerializerMethodField。 此更改之后,与 pref
我的 DRF 后端在这里遇到了一些小问题。 我正在用某些型号的选项填充字段。 我对一个模型有外键要求。当我创建模型时,我想将它保存在外国 ID 下。 当我请求模型时,无论选择字段映射到什么,我都想要模
型号: class Author(models.Model): name = models.CharField() class Book(models.Model): author = mod
我正在使用 Django 和 REST 框架。我想通过数据使用序列化程序进行保存。我调用 serializer.save() .但是保存的模型字段为空,animal字段在 HumanSerialize
我有一个 SerializerMethodField 计算下一个执行日期加上上次执行时间的小时数 简化代码,有这个模型: class Activity(BaseModel): name = m
我在序列化器上有两个 SerializerMethodFields。其中之一返回 obj.somelist.count() 正常。但是在我要求其他方法返回 obj.somelist[0] 的地方,我得
我是一名优秀的程序员,十分优秀!