首页 > 解决方案 > 慢 Django 多对多查询

问题描述

我有 900 万条记录。很快就会有200M。获取此信息可能需要 15 分钟以上:

在此处输入图像描述

class Follower():

    hashtags = models.ManyToManyField(
       "instagram_data.Hashtag", verbose_name=_("hashtags_name"))

class Hashtag(models.Model):
    name = models.CharField(_("HashtagName"), max_length=150, null=True, blank=True, unique=True) 

    def __str__(self):
        return self.name

乌本托 htop: ![

我认为它反向查找所有值。我认为它可能会找到 2000 条记录。我究竟做错了什么 ?

标签: djangopostgresql

解决方案


您发布的图像看起来像模型管理员,如果是这种情况,请尝试将该字段添加hashtags到模型管理员的raw_id_fields[Django docs]中(尽管您不会获得选择标签,并且必须手动输入 id/pk ) 或autocomplete_fields[Django docs]用于select2异步加载选项。这将类似于:

class HashtagAdmin(admin.ModelAdmin):
    ordering = ['name']
    search_fields = ['name']

class FollowerAdmin(admin.ModelAdmin):
    autocomplete_fields = ['hashtags']


admin.site.register(Follower, FollowerAdmin)
admin.site.register(Hashtag, HashtagAdmin)

如果这不在模型管理员中,您可以更改您在表单类上的表单中使用的小部件(您需要构建一个自定义小部件或寻找一些提供允许逗号分隔值的小部件的包),或者您可以使用包Django-Select2为用户提供可搜索的选择标签(再次使用 select2)。


推荐阅读