django-rest-framework - Django:序列化器+查询优化
问题描述
我有 Django 模型,如下所示,
class Chef(models.Model):
name = models.CharField(max_length=128, unique=True)
class Restaurant(models.Model):
chef = models.OneToOneField(User, related_name='profile', on_delete=models.CASCADE)
location = models.CharField(max_length=128)
ranking = models.IntegerField(default=99999)
和序列化程序类。
class ChefSerializer(serializers.ModelSerializer):
restaurant = RestaurantSerializer(read_only=True)
class Meta:
model = Chef
fields = ('name', 'restaurant')
class RestaurantSerializer(serializers.ModelSerializer):
class Meta:
model = Restaurant
fields = ('chef', 'location', 'ranking')
我用这样的。
class MyView(generics.ListCreateAPIView):
queryset = Chef.objects.all()
serializer_class = ChefSerializer
...
def do_somthing(self, request, *args, **kwargs):
queryset = self.get_queryset()
serializer = self.get_serializer(queryset)
calculate_something(serializer.data)
...
我想优化我的查询,所以尝试像下面这样检查它们。
...
print(queryset.query) # "SELECT chef.id, chef.name FROM chef"
...
但我找不到我RestaurantSerializer
使用的确切查询。
我想做类似的事情
print(restaurantserializer.data.query)
。我应该怎么办?我想知道何时以及如何Restaurant
执行与表相关的查询。我还想将我的查询优化为一个查询,例如
select c.name, r.location, r.ranking FROM chef c JOIN restaurant r ON c.id=r.chef_id
解决方案
您可以调整查询集:
res = Restaurant.objects.only('location', 'ranking').filter(chef_id=1)
如果您想获取厨师的姓名,您必须执行以下操作:
res = Restaurant.objects.select_related('chef').only('location', 'ranking', 'chef__name').filter(chef_id=1)
您可以在django websiteselect_related
中阅读更多详细信息。prefetch_related
Silk是查看 SQL 查询的一个有用的包。
推荐阅读
- mysql - 数据库插入/选择性能问题
- typescript - 如何实现包含构造函数和方法的 TypeScript 构造签名?
- php - Laravel 6 中的 404 错误,更改 .htaccess
- javascript - 上传前的 Directus v9 文件类型验证
- android - 如何添加BottomAppBar
- webpack - 如何使用 webpack、SPA 和动态导入优化 vue 应用程序?
- putty - 如何在 Putty 中将一个文件夹移回
- jmeter - JMeter - 处理大量响应
- javascript - 当我点击图像时,动画只工作一次
- memory-leaks - JVM 堆和 vmdata