如何在Django Rest框架中更有效地序列化数据?



这个问题解决了我的部分问题:#72534250
我明白我所遵循的路径是错误的,我应该将模型的优化更改为序列化器和/或视图集。
但是怎么做呢?


*我已经从模型Foo中删除了element_nameelement_text
class User(models.Model):
name = models.CharField(max_lenth=50)
age = models.IntergerField()
class Customer(models.Model):
user = models.ForeingKey(User, on_delete=models.CASCADE, verbose_name='User')
class Element(models.Model):
name = models.CharField(max_lenth=50)
text = models.TextField()

class Bar(models.Model):
element = models.ForeingKey(Element, on_delete=models.CASCADE, verbose_name='Element')
class Foo(models.Model):
bar = models.OneToOneField(Bar, on_delete=models.CASCADE, verbose_name='Bar')
customer = models.ForeingField(Customer, on_delete=models.CASCADE, verbose_name='Customer')
is_active = models.BooleanField('Is Active', default=False)

def user(self):
return self.customer.user

# Removed
def element_name(self):
return self.bar.element.name
# Removed
def element_text(self):
return self.bar.element.text

和这些序列化器:

class UserSerializer(ModelSerializer):
class Meta:
model = User
fields = '__all__'
class CustomerSerializer(ModelSerializer):
class Meta:
model = Customer
fields = '__all__'
class ElementSerializer(ModelSerializer):
class Meta:
model = Element
fields = '__all__'
class BarSerializer(ModelSerializer):
element = ElementSerializer()
class Meta:
model = Bar
fields = '__all__'
class FooSerializer(ModelSerializer):
bar = BarSerializer()
user = UserSerializer()

class Meta:
model = Foo
fields = '__all__'

和这个viewset:

class FooViewSet(ModelViewSet):
serializer_class = FooSerializer
permission_classes = [IsAuthenticated]
authentication_classes = [JWTAuthentication]
http_method_names = ['get', 'post', 'patch']
def get_queryset(self):
active = self.request.query_params.get('is_active', False)
name = self.request.query_params.get('name', '')
data = {'is_active': active}
if name == 'Fire':
data['bar__element__name'] = name
queryset = Foo.objects.filter(**data)
return queryset

我尝试了这个教程,但是我没有注意到任何真正的性能改进。所以我在寻找另一种方法来解决这个问题。

我想…如果我只是把select_related(...)get_queryset的返回,Django Rest将如何识别它是序列化缓存的数据?这真的会提高性能吗?

我还需要element_name,element_text和对象userFooViewSet的GET中返回。我怎样才能以最有效的方式归还它们?

Django Rest如何识别它是序列化的缓存的数据?这真的会提高性能吗?

select_related获取的所有数据都在你的模型对象实例中。由于序列化器和你定义的模型属性本质上使用这些实例,它们将访问这个cached"直接数据。

我还需要element_name, element_text和对象用户在FooViewSet的GET返回。我怎样才能以最有效的方式归还它们?

与此一致,您可以在一个查询中获得它们(包括element_nameelement_text需要的):

queryset = Foo.objects.select_related(
"bar__element",
"customer__user",
).filter(**data)

最新更新