如果使用prefetch_related Django,则清空M2M数据

问题描述

我正在将Django与DRF结合使用,并且遇到了N + 1问题。因此,我现在尝试使用prefetch_related,但是我遇到了一些问题。在任何情况下,prefetch_related都会返回空的查询集。

我正在使用:

  1. Django 3.0.7
  2. Djongo(用于MongoDB的Django DB后端)
  3. DRF(最新版本)

我试图在MysqL上切换项目,但没有帮助

DRF Test query  

@api_view(['GET'])
@permission_classes([AllowAny])
def test_prefetch(request):
    users = User.objects.prefetch_related('roles').filter(id=4) # id=4 it's my account which has roles
    print(users[0].roles.all())  # returns []
    print(users[0]._prefetched_objects_cache) # returns {"roles": []}
    return Response(123,status=200)

Models

class UserRoles(models.Model):     
    user = models.ForeignKey(to="User",on_delete=models.DO_nothing,default=None)    
    role_type = models.CharField(default="",max_length=256)    
    given_at = models.DateTimeField(default=api.functions.get_local_time)     
    expires_at = models.DateTimeField(default=api.functions.get_local_time,null=True) 
    def __str__(self): 
        return self.role_type  

class User(AbstractBaseUser,PermissionsMixin): 
    ....      
    roles = models.ManyToManyField(UserRoles,symmetrical=True)

解决方法

已修复。问题出在Djongo。我在PostgreSQL上切换了项目,现在可以使用了。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...