いつもサイトを検索していますが、これは私の最初の投稿です。他の誰かがこの問題を抱えているという証拠を見つけることができません。
MySQL データベース バックエンドを使用して django-tastypie で構築された REST API があります。API が呼び出されるたびに (たとえば、ブラウザーまたは angularJS フロントエンドを使用して)、django-tastypie バックエンドはすべてのデータベース呼び出しを 2 回行います。
1 つの API 呼び出しからの django SQL ロガーの出力を次に示します。
(0.019) SELECT COUNT(*) FROM `products`; args=()
(0.020) SELECT `products`.`id` FROM `products` LIMIT 30; args=()
(0.023) SELECT (`product_styles`.`product_id`) AS `_prefetch_related_val`, `styles`.`id`, `styles`.`name` FROM `styles` INNER JOIN `product_styles` ON (`styles`.`id` = `product_styles`.`style_id`) WHERE `product_styles`.`product_id` IN (517, 518, 661, 662, 539, 429, 569, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 611, 597, 87, 88, 443, 509, 510, 511); args=(517, 518, 661, 662, 539, 429, 569, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 611, 597, 87, 88, 443, 509, 510, 511)
(0.020) SELECT COUNT(*) FROM `products`; args=()
(0.020) SELECT `products`.`id` FROM `products` LIMIT 30; args=()
(0.022) SELECT (`product_styles`.`product_id`) AS `_prefetch_related_val`, `styles`.`id`, `styles`.`name` FROM `styles` INNER JOIN `product_styles` ON (`styles`.`id` = `product_styles`.`style_id`) WHERE `product_styles`.`product_id` IN (517, 518, 661, 662, 539, 429, 569, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 611, 597, 87, 88, 443, 509, 510, 511); args=(517, 518, 661, 662, 539, 429, 569, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 611, 597, 87, 88, 443, 509, 510, 511)
タイミングは異なりますが、クエリは同じです。重複したクエリが実際に発生していることを MySQL にログインすることで確認しました。これは単なる django のログの問題ではありません。また、wireshark を使用して、1 つの http 要求と応答のみが送信されていることを確認しました (つまり、誤って 2 つの API 呼び出しを行ったからではありません)。
モデルとリソースのコードを、問題を再現するために必要な最小限の骨に切り戻し、以下に含めました。これをさらに調査する方法について、誰かがアイデアを提供できますか? 私は困惑しています。
api.py
from tastypie.resources import ModelResource, Resource
from tastypie.fields import ToOneField, ToManyField
from FrameFish_aws.models import Product, ProductStyle, Style
class StyleResource(ModelResource):
class Meta:
queryset = Style.objects.all()
class ProductResource(ModelResource):
styles = ToManyField('FrameFish_aws.api.StyleResource', 'styles', full=True)
class Meta:
queryset = Product.objects.all().prefetch_related('styles')
resource_name = 'frames'
allowed_methods = ['get']
models.py
from django.db import models
class Style(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=300)
class Meta:
db_table = u'styles'
class ProductStyle(models.Model):
"""Intermediate table for holding associating styles with products"""
style = models.ForeignKey('Style', to_field='id')
product = models.ForeignKey('Product', to_field='id')
class Meta:
db_table = u'product_styles'
class Product(models.Model):
id = models.IntegerField(primary_key=True)
styles = models.ManyToManyField('Style', through='ProductStyle')
class Meta:
db_table = u'products'