- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在我的 SerializerMethodField 中访问相关字段的数据,并且对正在呈现的每个对象都有一个查询。我的模型看起来像(为简洁起见,将保持简短):
class Listing(models.Model):
variant = models.ForeignKey(to='Variant', related_name='variant_listings')
seller = models.ForeignKey(to='user.Seller', related_name='seller_listings')
locality = models.ForeignKey(to='user.Locality', blank=True, null=True)
price = models.IntegerField(blank=True, null=True)
Variant
、Seller
和Locality
都是相关模型。
我的 View 集:
class ListingViewSet(viewsets.ModelViewSet):
"""Viewset class for Listing model"""
queryset = Listing.objects.all()
serializer_class = ListingSerializer
pagination_class = TbPagination
filter_backends = (filters.DjangoFilterBackend,)
filter_class = ListingFilter
def get_queryset(self):
listing_qs = Listing.objects.filter(status='active')
listing_qs = ListingSerializer.setup_eager_loading(listing_qs)
return listing_qs
还有我的序列化器:
class ListingSerializer(serializers.ModelSerializer):
"""Serializer class for Listing model"""
@staticmethod
def setup_eager_loading(queryset):
queryset = queryset.prefetch_related('variant', 'seller', 'locality')
return queryset
@staticmethod
def get_car_link(obj):
variant_name_slug = obj.variant.name.replace(' ', '-').replace('+', '')
return '/buy-' + obj.seller.city.name.lower() + '/' + variant_name_slug
car_link = serializers.SerializerMethodField(read_only=True)
@staticmethod
def get_car_info(obj):
return {
'id': obj.id,
'variant_name': obj.variant.name,
'localities': obj.locality.name,
}
car_info = serializers.SerializerMethodField(read_only=True)
@staticmethod
def get_image_urls(obj):
caption_ids = [1, 2, 3, 5, 7, 8, 18]
attachments_qs = Attachment.objects.filter(listing_id=obj.id, caption_id__in=caption_ids)
image_urls = []
for attachment in attachments_qs:
url = str(obj.id) + '-' + str(attachment.file_number) + '-360.jpg'
image_urls.append(url)
return image_urls
image_urls = serializers.SerializerMethodField(read_only=True)
class Meta:
model = Listing
fields = ('car_link', 'car_info', 'sort_by', 'image_urls')
对于 ListView 集返回的每个列表,都会查询在 SerializerMethodField 中访问的每个相关字段。
我发现了一些相关问题,例如 this .但这没有帮助。此外,我尝试在 View 集的 get_queryset 方法上执行 prefetch_related
,并在 this 的帮助下实现了预先加载。文章。但没有任何帮助。
有什么办法可以避免这些查询吗?
编辑
上面编写的 get_car_info 函数包含更多字段(连同已经存在的字段),在前端呈现的最终序列化数据中,在名为 car_info 的嵌套 JSON 中单独需要这些字段。
最佳答案
这篇文章我用过: http://ses4j.github.io/2015/11/23/optimizing-slow-django-rest-framework-performance/
我在我的序列化程序中创建了一个预加载方法,如下所示:
class EagerGetProjectSerializer(serializers.ModelSerializer):
lead_researcher = UserSerializer()
participating_researcher = UserSerializer(many=True)
client = ProjectClientSerializer()
test_items = TestItemSerializer(many=True)
@staticmethod
def setup_eager_loading(queryset):
queryset = queryset.select_related('lead_researcher', 'client')
queryset = queryset.prefetch_related('participating_researcher',
'test_items')
return queryset
class Meta:
model = Project
fields = '__all__'
请注意,在引用要在序列化程序中提取的对象时,您必须使用与外键相关的名称属性。
在我看来,在访问序列化程序之前调用:
class SingleProject(APIView):
def get(self, request):
ans = Project.objects.filter(id=project_id)
qs = EagerGetProjectSerializer.setup_eager_loading(ans)
serializer = EagerGetProjectSerializer(qs, many=True)
关于django - 在 Django REST 框架中优化 SerializerMethodField 中的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45097170/
我在对按 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] 的地方,我得
我是一名优秀的程序员,十分优秀!