相关疑难解决方法(0)

在Django REST框架中优化数据库查询

我有以下型号:

class User(models.Model):
    name = models.Charfield()
    email = models.EmailField()

class Friendship(models.Model):
    from_friend = models.ForeignKey(User)
    to_friend = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)

这些模型用于以下视图和序列化程序:

class GetAllUsers(generics.ListAPIView):
    authentication_classes = (SessionAuthentication, TokenAuthentication)
    permission_classes = (permissions.IsAuthenticated,)
    serializer_class = GetAllUsersSerializer
    model = User

    def get_queryset(self):
        return User.objects.all()

class GetAllUsersSerializer(serializers.ModelSerializer):

    is_friend_already = serializers.SerializerMethodField('get_is_friend_already')

    class Meta:
        model = User
        fields = ('id', 'name', 'email', 'is_friend_already',)

    def get_is_friend_already(self, obj):
        request = self.context.get('request', None)

        if request.user != obj and Friendship.objects.filter(from_friend = user):
            return True
        else:
            return False
Run Code Online (Sandbox Code Playgroud)

所以基本上,对于GetAllUsers视图返回的每个用户,我想打印出用户是否是请求者的朋友(实际上我应该检查from_和to_friend,但对于问题并不重要)

我看到的是,对于数据库中的N个用户,有1个查询用于获取所有N个用户,然后在序列化程序中查询1xN个查询 get_is_friend_already

有没有办法在休息框架方式中避免这种情况?也许是将select_related …

python django-orm django-queryset django-select-related django-rest-framework

19
推荐指数
2
解决办法
1万
查看次数

使用迁移为Django中的模型字段添加索引

我正在尝试使用Field.db_index具有迁移的应用程序在模型字段上添加索引.看看Django的文档我需要做的就是设置db_index=True:

class Person(models.Model):
    first_name = models.CharField()
    last_name = models.CharField(db_index=True)
Run Code Online (Sandbox Code Playgroud)

然后我首先尝试了新的Django迁移:

./manage.py makemigrations app-name
Run Code Online (Sandbox Code Playgroud)

但是迁移似乎没有注意到更改,也没有添加用于创建索引的sql命令.所以我试着django-admin.py按照这里的解释:

django-admin.py sqlindexes app-name
Run Code Online (Sandbox Code Playgroud)

但是,这也不会打印sql命令,它会退出并出现以下错误:

CommandError: App 'app-name' has migrations. Only the sqlmigrate and sqlflush commands can be used when an app has migrations.
Run Code Online (Sandbox Code Playgroud)

django django-models django-admin django-migrations django-2.1

10
推荐指数
3
解决办法
4980
查看次数