简体   繁体   中英

django rest framework How to delete redundant queries?

I use Django debug_toolbar to see SQL query and I want to delete the second SQL query.

1.(SELECT ... FROM auth_user LEFT OUTER JOIN accounts_userextension ON (auth_user.id = accounts_userextension.user_id) 50.86474349085549% 28.30 Sel 
Expl)   
2.(SELECT ... FROM auth_user LIMIT 1000  49.13525650914451%   27.34 Sel  Expl)

Here is models.py :

class UserExtension(models.Model):      
    user = models.OneToOneField(User,on_delete=models.CASCADE,related_name='user_detail')
    birthday = models.DateField(null=True,blank=True)

Here is serializers.py :

from django.contrib.auth.models import User   
from .models import UserExtension    
class UserExtensionSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserExtension
        fields = '__all__'

class accountDetailSerializer(serializers.ModelSerializer):
    user_detail = UserExtensionSerializer()
    class Meta:
        model = User
        fields = [
            "username",
            "email",
            "first_name",
            'user_detail',
        ]

Here is views.py :

class AccountView(generics.ListCreateAPIView):    
    queryset = User.objects.all().select_related('user_detail')
    serializer_class = accountDetailSerializer
    permission_classes = ()

I think the extra query is because of user_detail = UserExtensionSerializer() . Try below code. I've not tested but it should work.

class accountDetailSerializer(serializers.ModelSerializer):
    user_details = UserExtensionSerializer(source='user_detail')
    class Meta:
        model = User
        fields = [
            "username",
            "email",
            "first_name",
            'user_details',
        ]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM