Использую Django для API своего проекта, и использую Djongo для соединения Django с MongoDB. В итоге, из-за проблемы n+1 запросов мне пришлось использовать prefetch_related. Но, когда я выполняю эту функцию в QuerySet, то M2M поля которые я префетчу становятся пустыми.
Тестовый запрос DRF:
DRF Test query
@api_view(['GET'])
@permission_classes([AllowAny])
def test_prefetch(request):
users = User.objects.prefetch_related('roles').filter(id=4) # id=4 - аккаунт с ролями
print(users[0].roles.all()) # возвращает []
print(users[0]._prefetched_objects_cache) # возвращает {"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)